@woosh/meep-engine 3.42.0 → 3.44.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 (345) hide show
  1. package/editor/prototypeEditorShell.d.ts.map +1 -1
  2. package/editor/prototypeEditorShell.js +4 -2
  3. package/package.json +91 -96
  4. package/src/engine/Clock.d.ts +15 -0
  5. package/src/engine/Clock.d.ts.map +1 -1
  6. package/src/engine/Clock.js +29 -5
  7. package/src/engine/Engine.d.ts.map +1 -1
  8. package/src/engine/Engine.js +11 -19
  9. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts +57 -0
  10. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts.map +1 -0
  11. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.js +84 -0
  12. package/src/engine/graphics3/AnimationGraphSystem.d.ts +23 -13
  13. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  14. package/src/engine/graphics3/AnimationGraphSystem.js +61 -64
  15. package/src/engine/graphics3/AnimationSystem.d.ts +24 -15
  16. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  17. package/src/engine/graphics3/AnimationSystem.js +67 -61
  18. package/src/engine/graphics3/MeshSkinSystem.d.ts +56 -0
  19. package/src/engine/graphics3/MeshSkinSystem.d.ts.map +1 -0
  20. package/src/engine/graphics3/MeshSkinSystem.js +317 -0
  21. package/src/engine/graphics3/MeshSystem.d.ts +15 -35
  22. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  23. package/src/engine/graphics3/MeshSystem.js +21 -298
  24. package/src/engine/graphics3/RowChains.d.ts +76 -0
  25. package/src/engine/graphics3/RowChains.d.ts.map +1 -0
  26. package/src/engine/graphics3/RowChains.js +347 -0
  27. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +6 -0
  28. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  29. package/src/engine/graphics3/ShadedGeometrySystem.js +329 -309
  30. package/src/engine/graphics3/animation/AnimationClips.d.ts +56 -0
  31. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -0
  32. package/src/engine/graphics3/animation/AnimationClips.js +79 -0
  33. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +13 -14
  34. package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
  35. package/src/engine/graphics3/animation/ClipListPlayer.js +262 -263
  36. package/src/engine/graphics3/animation/write_clip_playback.d.ts +3 -3
  37. package/src/engine/graphics3/animation/write_clip_playback.js +4 -4
  38. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +5 -0
  39. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
  40. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +80 -75
  41. package/src/engine/graphics3/prefab/PrefabInstance.d.ts +4 -24
  42. package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -1
  43. package/src/engine/graphics3/prefab/PrefabInstance.js +60 -80
  44. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +16 -3
  45. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
  46. package/src/engine/graphics3/prefab/prefab_instantiate.js +49 -12
  47. package/src/engine/graphics3/prefab/prefab_place.d.ts +31 -17
  48. package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -1
  49. package/src/engine/graphics3/prefab/prefab_place.js +175 -130
  50. package/src/engine/graphics3/register_clips.d.ts +64 -0
  51. package/src/engine/graphics3/register_clips.d.ts.map +1 -0
  52. package/src/engine/graphics3/register_clips.js +114 -0
  53. package/src/engine/physics/cloth/MEASUREMENTS.md +795 -0
  54. package/src/engine/physics/cloth/PLAN.md +339 -9
  55. package/src/engine/physics/cloth/build/ClothProxy.d.ts +113 -61
  56. package/src/engine/physics/cloth/build/ClothProxy.d.ts.map +1 -1
  57. package/src/engine/physics/cloth/build/ClothProxy.js +142 -77
  58. package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts +22 -0
  59. package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts.map +1 -0
  60. package/src/engine/physics/cloth/build/cloth_bind_in_frame.js +75 -0
  61. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +43 -30
  62. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  63. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +357 -284
  64. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts +62 -0
  65. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts.map +1 -0
  66. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.js +280 -0
  67. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts +1 -1
  68. package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +1 -1
  69. package/src/engine/physics/cloth/ecs/Cloth.d.ts +17 -9
  70. package/src/engine/physics/cloth/ecs/Cloth.d.ts.map +1 -1
  71. package/src/engine/physics/cloth/ecs/Cloth.js +220 -212
  72. package/src/engine/physics/cloth/ecs/ClothDynamicsFlags.js +6 -0
  73. package/src/engine/physics/cloth/ecs/ClothHold.d.ts +91 -0
  74. package/src/engine/physics/cloth/ecs/ClothHold.d.ts.map +1 -0
  75. package/src/engine/physics/cloth/ecs/ClothHold.js +103 -0
  76. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +254 -48
  77. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  78. package/src/engine/physics/cloth/ecs/ClothInstance.js +277 -47
  79. package/src/engine/physics/cloth/ecs/ClothPin.d.ts +73 -0
  80. package/src/engine/physics/cloth/ecs/ClothPin.d.ts.map +1 -0
  81. package/src/engine/physics/cloth/ecs/ClothPin.js +92 -0
  82. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts +36 -0
  83. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts.map +1 -0
  84. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.js +61 -0
  85. package/src/engine/physics/cloth/ecs/ClothRig.d.ts +23 -17
  86. package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
  87. package/src/engine/physics/cloth/ecs/ClothRig.js +29 -27
  88. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +12 -14
  89. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  90. package/src/engine/physics/cloth/ecs/ClothSystem.js +20 -15
  91. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +57 -36
  92. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  93. package/src/engine/physics/cloth/ecs/ClothWorld.js +816 -179
  94. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +12 -13
  95. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -1
  96. package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +20 -14
  97. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +63 -11
  98. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  99. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +321 -84
  100. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts +9 -7
  101. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
  102. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +9 -7
  103. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +3 -3
  104. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +30 -30
  105. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts +37 -0
  106. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts.map +1 -0
  107. package/src/engine/physics/cloth/ecs/cloth_geodesic.js +142 -0
  108. package/src/engine/physics/cloth/ecs/cloth_holds.d.ts +97 -0
  109. package/src/engine/physics/cloth/ecs/cloth_holds.d.ts.map +1 -0
  110. package/src/engine/physics/cloth/ecs/cloth_holds.js +608 -0
  111. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts +2 -2
  112. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -1
  113. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +160 -9
  114. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +17 -22
  115. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
  116. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +55 -117
  117. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts +21 -6
  118. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
  119. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +44 -15
  120. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +5 -0
  121. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
  122. package/src/engine/physics/cloth/ecs/cloth_write_back.js +60 -16
  123. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -1
  124. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +65 -58
  125. package/src/engine/physics/cloth/playground/collide_main.js +1 -1
  126. package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
  127. package/src/engine/physics/cloth/playground/garment_build.js +17 -5
  128. package/src/engine/physics/cloth/playground/garment_main.js +1 -1
  129. package/src/engine/physics/cloth/playground/rig_build.d.ts.map +1 -1
  130. package/src/engine/physics/cloth/playground/rig_build.js +302 -296
  131. package/src/engine/physics/cloth/solver/ClothState.d.ts +45 -7
  132. package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
  133. package/src/engine/physics/cloth/solver/ClothState.js +63 -7
  134. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts +6 -1
  135. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -1
  136. package/src/engine/physics/cloth/solver/cloth_contact_find.js +7 -2
  137. package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts +114 -0
  138. package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts.map +1 -0
  139. package/src/engine/physics/cloth/solver/cloth_hold_line.js +362 -0
  140. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts +6 -2
  141. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -1
  142. package/src/engine/physics/cloth/solver/cloth_self_find.js +13 -13
  143. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +24 -12
  144. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
  145. package/src/engine/physics/cloth/solver/cloth_solver_constants.js +24 -12
  146. package/src/engine/physics/cloth/solver/cloth_step.d.ts +16 -0
  147. package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
  148. package/src/engine/physics/cloth/solver/cloth_step.js +183 -20
  149. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +1 -0
  150. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -1
  151. package/src/engine/physics/cloth/solver/cloth_step_instance.js +10 -3
  152. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts +1 -1
  153. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts.map +1 -1
  154. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.js +353 -346
  155. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts +7 -5
  156. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -1
  157. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +7 -5
  158. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts +9 -9
  159. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -1
  160. package/src/engine/physics/cloth/wind/cloth_sample_air.js +26 -26
  161. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  162. package/src/engine/simulation/Ticker.d.ts +13 -0
  163. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  164. package/src/engine/simulation/Ticker.js +43 -8
  165. package/src/shade/RENDERER_CONTRACT.md +8 -2
  166. package/src/shade/playground/mesh_row_ceiling/main.js +2 -1
  167. package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
  168. package/src/shade/playground/skinned_blas_refit/main.js +11 -19
  169. package/src/shade/playground/skinned_blas_refit/place_character.d.ts +6 -3
  170. package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
  171. package/src/shade/playground/skinned_blas_refit/place_character.js +90 -90
  172. package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
  173. package/src/shade/playground/skinned_mesh_soup/main.js +502 -509
  174. package/src/shade/playground/texture_encode/README.md +129 -109
  175. package/src/shade/playground/texture_encode/main.js +1430 -1430
  176. package/src/shade/playground/vgeo_runtime/README.md +5 -4
  177. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  178. package/src/shade/renderer/Renderer.js +6 -5
  179. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +45 -14
  180. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  181. package/src/shade/renderer/animation/GPUAnimationManager.js +316 -64
  182. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +5 -0
  183. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  184. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -1
  185. package/src/shade/renderer/atmosphere/GPUSky.d.ts +12 -0
  186. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  187. package/src/shade/renderer/atmosphere/GPUSky.js +162 -147
  188. package/src/shade/renderer/geometry/BoxGeometry.d.ts +1 -11
  189. package/src/shade/renderer/geometry/BoxGeometry.d.ts.map +1 -1
  190. package/src/shade/renderer/geometry/BoxGeometry.js +6 -13
  191. package/src/shade/renderer/geometry/CapsuleGeometry.d.ts +19 -0
  192. package/src/shade/renderer/geometry/CapsuleGeometry.d.ts.map +1 -0
  193. package/src/shade/renderer/geometry/CapsuleGeometry.js +24 -0
  194. package/src/shade/renderer/geometry/ConeGeometry.d.ts +20 -0
  195. package/src/shade/renderer/geometry/ConeGeometry.d.ts.map +1 -0
  196. package/src/shade/renderer/geometry/ConeGeometry.js +33 -0
  197. package/src/shade/renderer/geometry/CylinderGeometry.d.ts +21 -0
  198. package/src/shade/renderer/geometry/CylinderGeometry.d.ts.map +1 -0
  199. package/src/shade/renderer/geometry/CylinderGeometry.js +35 -0
  200. package/src/shade/renderer/geometry/PlaneGeometry.d.ts +17 -0
  201. package/src/shade/renderer/geometry/PlaneGeometry.d.ts.map +1 -0
  202. package/src/shade/renderer/geometry/PlaneGeometry.js +22 -0
  203. package/src/shade/renderer/geometry/TorusGeometry.d.ts +18 -0
  204. package/src/shade/renderer/geometry/TorusGeometry.d.ts.map +1 -0
  205. package/src/shade/renderer/geometry/TorusGeometry.js +23 -0
  206. package/src/shade/renderer/geometry/UVSphereGeometry.d.ts +21 -0
  207. package/src/shade/renderer/geometry/UVSphereGeometry.d.ts.map +1 -0
  208. package/src/shade/renderer/geometry/UVSphereGeometry.js +34 -0
  209. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts +19 -0
  210. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts.map +1 -0
  211. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.js +205 -0
  212. package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts +21 -0
  213. package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts.map +1 -0
  214. package/src/shade/renderer/geometry/primitives/make_cone_geometry.js +36 -0
  215. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts +1 -1
  216. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts.map +1 -1
  217. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.js +44 -9
  218. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts +20 -0
  219. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts.map +1 -0
  220. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.js +190 -0
  221. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
  222. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +7 -2
  223. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts +26 -8
  224. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts.map +1 -1
  225. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js +56 -39
  226. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +7 -0
  227. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
  228. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +46 -4
  229. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.d.ts.map +1 -1
  230. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.js +4 -2
  231. package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +2 -2
  232. package/src/shade/renderer/gpu_primitive/sort/defs.js +79 -79
  233. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +1 -1
  234. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  235. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +7 -3
  236. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.d.ts.map +1 -1
  237. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +10 -3
  238. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  239. package/src/shade/renderer/particles/DESIGN.md +13 -9
  240. package/src/shade/renderer/particles/GPUParticleSystem.js +1 -1
  241. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +4 -3
  242. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
  243. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +200 -194
  244. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  245. package/src/shade/renderer/particles/graph_particles.js +6 -2
  246. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts +1 -1
  247. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.js +1 -1
  248. package/src/shade/renderer/particles/warmup/graph_particle_warmup.d.ts.map +1 -1
  249. package/src/shade/renderer/particles/warmup/graph_particle_warmup.js +334 -329
  250. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  251. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  252. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +7 -2
  253. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
  254. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +16 -4
  255. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +3 -2
  256. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  257. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +3 -2
  258. package/src/shade/renderer/scene/GPUSceneContext.d.ts +9 -1
  259. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  260. package/src/shade/renderer/scene/GPUSceneContext.js +23 -1
  261. package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +2444 -2345
  262. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.d.ts.map +1 -1
  263. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.js +312 -310
  264. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts +3 -3
  265. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts.map +1 -1
  266. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.js +383 -375
  267. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.d.ts.map +1 -1
  268. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.js +349 -346
  269. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts +58 -0
  270. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts.map +1 -0
  271. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.js +536 -0
  272. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts +21 -7
  273. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts.map +1 -1
  274. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.js +291 -327
  275. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts +25 -0
  276. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts.map +1 -0
  277. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.js +99 -0
  278. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts +5 -3
  279. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts.map +1 -1
  280. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.js +47 -71
  281. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts +10 -0
  282. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts.map +1 -0
  283. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.js +50 -0
  284. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts +4 -5
  285. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts.map +1 -1
  286. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.js +7 -8
  287. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +4 -1
  288. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  289. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +74 -3
  290. package/src/shade/renderer/volumetrics/NOTES.md +1023 -957
  291. package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.d.ts +5 -4
  292. package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.d.ts.map +1 -1
  293. package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.js +5 -4
  294. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.d.ts +1 -1
  295. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.js +1 -1
  296. package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.d.ts +1 -1
  297. package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.js +1 -1
  298. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts +41 -0
  299. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts.map +1 -0
  300. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +112 -0
  301. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +9 -23
  302. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  303. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +18 -126
  304. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.d.ts +22 -0
  305. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.d.ts.map +1 -0
  306. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.js +228 -0
  307. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  308. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +0 -53
  309. package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
  310. package/src/shade/renderer/water/chunk_water_transport.js +7 -5
  311. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  312. package/src/shade/renderer/water/medium/GPUWaterBodies.js +8 -2
  313. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts +3 -2
  314. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
  315. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +3 -2
  316. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  317. package/src/shade/renderer/water/shader_water.js +3 -1
  318. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -1
  319. package/src/shade/renderer/water/surface/GPUWaterSurface.js +3 -1
  320. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +4 -3
  321. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts.map +1 -1
  322. package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +17 -7
  323. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
  324. package/src/shade/renderer/water/surface/graph_water_tessellation.js +11 -4
  325. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -1
  326. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +93 -30
  327. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -1
  328. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +13 -5
  329. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +29 -8
  330. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -1
  331. package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +155 -30
  332. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +6 -1
  333. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -1
  334. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +157 -39
  335. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +91 -21
  336. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -1
  337. package/src/shade/renderer/water/surface/particles/shader_water_particles.js +442 -70
  338. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +11 -3
  339. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  340. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +3 -0
  341. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  342. package/src/shade/wgsl/validate_wgsl_source.js +74 -3
  343. package/src/engine/graphics3/register_instance_animation.d.ts +0 -114
  344. package/src/engine/graphics3/register_instance_animation.d.ts.map +0 -1
  345. 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"}