@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.
- package/editor/prototypeEditorShell.d.ts.map +1 -1
- package/editor/prototypeEditorShell.js +4 -2
- package/package.json +91 -96
- package/src/engine/Clock.d.ts +15 -0
- package/src/engine/Clock.d.ts.map +1 -1
- package/src/engine/Clock.js +29 -5
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +11 -19
- package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts +57 -0
- package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts.map +1 -0
- package/src/engine/graphics/ecs/mesh-v2/MeshSkin.js +84 -0
- package/src/engine/graphics3/AnimationGraphSystem.d.ts +23 -13
- package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.js +61 -64
- package/src/engine/graphics3/AnimationSystem.d.ts +24 -15
- package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationSystem.js +67 -61
- package/src/engine/graphics3/MeshSkinSystem.d.ts +56 -0
- package/src/engine/graphics3/MeshSkinSystem.d.ts.map +1 -0
- package/src/engine/graphics3/MeshSkinSystem.js +317 -0
- package/src/engine/graphics3/MeshSystem.d.ts +15 -35
- package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
- package/src/engine/graphics3/MeshSystem.js +21 -298
- package/src/engine/graphics3/RowChains.d.ts +76 -0
- package/src/engine/graphics3/RowChains.d.ts.map +1 -0
- package/src/engine/graphics3/RowChains.js +347 -0
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts +6 -0
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
- package/src/engine/graphics3/ShadedGeometrySystem.js +329 -309
- package/src/engine/graphics3/animation/AnimationClips.d.ts +56 -0
- package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -0
- package/src/engine/graphics3/animation/AnimationClips.js +79 -0
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts +13 -14
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
- package/src/engine/graphics3/animation/ClipListPlayer.js +262 -263
- package/src/engine/graphics3/animation/write_clip_playback.d.ts +3 -3
- package/src/engine/graphics3/animation/write_clip_playback.js +4 -4
- package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +5 -0
- package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
- package/src/engine/graphics3/pose/query_entity_node_world_pose.js +80 -75
- package/src/engine/graphics3/prefab/PrefabInstance.d.ts +4 -24
- package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/PrefabInstance.js +60 -80
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +16 -3
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/prefab_instantiate.js +49 -12
- package/src/engine/graphics3/prefab/prefab_place.d.ts +31 -17
- package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/prefab_place.js +175 -130
- package/src/engine/graphics3/register_clips.d.ts +64 -0
- package/src/engine/graphics3/register_clips.d.ts.map +1 -0
- package/src/engine/graphics3/register_clips.js +114 -0
- package/src/engine/physics/cloth/MEASUREMENTS.md +795 -0
- package/src/engine/physics/cloth/PLAN.md +339 -9
- package/src/engine/physics/cloth/build/ClothProxy.d.ts +113 -61
- package/src/engine/physics/cloth/build/ClothProxy.d.ts.map +1 -1
- package/src/engine/physics/cloth/build/ClothProxy.js +142 -77
- package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts +22 -0
- package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts.map +1 -0
- package/src/engine/physics/cloth/build/cloth_bind_in_frame.js +75 -0
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +43 -30
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +357 -284
- package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts +62 -0
- package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts.map +1 -0
- package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.js +280 -0
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts +1 -1
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +1 -1
- package/src/engine/physics/cloth/ecs/Cloth.d.ts +17 -9
- package/src/engine/physics/cloth/ecs/Cloth.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/Cloth.js +220 -212
- package/src/engine/physics/cloth/ecs/ClothDynamicsFlags.js +6 -0
- package/src/engine/physics/cloth/ecs/ClothHold.d.ts +91 -0
- package/src/engine/physics/cloth/ecs/ClothHold.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothHold.js +103 -0
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +254 -48
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +277 -47
- package/src/engine/physics/cloth/ecs/ClothPin.d.ts +73 -0
- package/src/engine/physics/cloth/ecs/ClothPin.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothPin.js +92 -0
- package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts +36 -0
- package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.js +61 -0
- package/src/engine/physics/cloth/ecs/ClothRig.d.ts +23 -17
- package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothRig.js +29 -27
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +12 -14
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.js +20 -15
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +57 -36
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.js +816 -179
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +12 -13
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +20 -14
- package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +63 -11
- package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_build_rows.js +321 -84
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts +9 -7
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +9 -7
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +3 -3
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +30 -30
- package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts +37 -0
- package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/cloth_geodesic.js +142 -0
- package/src/engine/physics/cloth/ecs/cloth_holds.d.ts +97 -0
- package/src/engine/physics/cloth/ecs/cloth_holds.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/cloth_holds.js +608 -0
- package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts +2 -2
- package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +160 -9
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +17 -22
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +55 -117
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts +21 -6
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +44 -15
- package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +5 -0
- package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_write_back.js +60 -16
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +65 -58
- package/src/engine/physics/cloth/playground/collide_main.js +1 -1
- package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
- package/src/engine/physics/cloth/playground/garment_build.js +17 -5
- package/src/engine/physics/cloth/playground/garment_main.js +1 -1
- package/src/engine/physics/cloth/playground/rig_build.d.ts.map +1 -1
- package/src/engine/physics/cloth/playground/rig_build.js +302 -296
- package/src/engine/physics/cloth/solver/ClothState.d.ts +45 -7
- package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/ClothState.js +63 -7
- package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts +6 -1
- package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_contact_find.js +7 -2
- package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts +114 -0
- package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_hold_line.js +362 -0
- package/src/engine/physics/cloth/solver/cloth_self_find.d.ts +6 -2
- package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_self_find.js +13 -13
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +24 -12
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_solver_constants.js +24 -12
- package/src/engine/physics/cloth/solver/cloth_step.d.ts +16 -0
- package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step.js +183 -20
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +1 -0
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step_instance.js +10 -3
- package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.js +353 -346
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts +7 -5
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +7 -5
- package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts +9 -9
- package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -1
- package/src/engine/physics/cloth/wind/cloth_sample_air.js +26 -26
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/simulation/Ticker.d.ts +13 -0
- package/src/engine/simulation/Ticker.d.ts.map +1 -1
- package/src/engine/simulation/Ticker.js +43 -8
- package/src/shade/RENDERER_CONTRACT.md +8 -2
- package/src/shade/playground/mesh_row_ceiling/main.js +2 -1
- package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/main.js +11 -19
- package/src/shade/playground/skinned_blas_refit/place_character.d.ts +6 -3
- package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/place_character.js +90 -90
- package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_mesh_soup/main.js +502 -509
- package/src/shade/playground/texture_encode/README.md +129 -109
- package/src/shade/playground/texture_encode/main.js +1430 -1430
- package/src/shade/playground/vgeo_runtime/README.md +5 -4
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +6 -5
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +45 -14
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +316 -64
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +5 -0
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -1
- package/src/shade/renderer/atmosphere/GPUSky.d.ts +12 -0
- package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/GPUSky.js +162 -147
- package/src/shade/renderer/geometry/BoxGeometry.d.ts +1 -11
- package/src/shade/renderer/geometry/BoxGeometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/BoxGeometry.js +6 -13
- package/src/shade/renderer/geometry/CapsuleGeometry.d.ts +19 -0
- package/src/shade/renderer/geometry/CapsuleGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/CapsuleGeometry.js +24 -0
- package/src/shade/renderer/geometry/ConeGeometry.d.ts +20 -0
- package/src/shade/renderer/geometry/ConeGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/ConeGeometry.js +33 -0
- package/src/shade/renderer/geometry/CylinderGeometry.d.ts +21 -0
- package/src/shade/renderer/geometry/CylinderGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/CylinderGeometry.js +35 -0
- package/src/shade/renderer/geometry/PlaneGeometry.d.ts +17 -0
- package/src/shade/renderer/geometry/PlaneGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/PlaneGeometry.js +22 -0
- package/src/shade/renderer/geometry/TorusGeometry.d.ts +18 -0
- package/src/shade/renderer/geometry/TorusGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/TorusGeometry.js +23 -0
- package/src/shade/renderer/geometry/UVSphereGeometry.d.ts +21 -0
- package/src/shade/renderer/geometry/UVSphereGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/UVSphereGeometry.js +34 -0
- package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts +19 -0
- package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/primitives/make_capsule_geometry.js +205 -0
- package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts +21 -0
- package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/primitives/make_cone_geometry.js +36 -0
- package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts +1 -1
- package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.js +44 -9
- package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts +20 -0
- package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.js +190 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +7 -2
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts +26 -8
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js +56 -39
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +7 -0
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +46 -4
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.js +4 -2
- package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +2 -2
- package/src/shade/renderer/gpu_primitive/sort/defs.js +79 -79
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +1 -1
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +7 -3
- package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +10 -3
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/particles/DESIGN.md +13 -9
- package/src/shade/renderer/particles/GPUParticleSystem.js +1 -1
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +4 -3
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +200 -194
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +6 -2
- package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_lighting.js +1 -1
- package/src/shade/renderer/particles/warmup/graph_particle_warmup.d.ts.map +1 -1
- package/src/shade/renderer/particles/warmup/graph_particle_warmup.js +334 -329
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +7 -2
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +16 -4
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +3 -2
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +3 -2
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +9 -1
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +23 -1
- package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +2444 -2345
- package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.js +312 -310
- package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts +3 -3
- package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.js +383 -375
- package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.js +349 -346
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts +58 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts.map +1 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.js +536 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts +21 -7
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.js +291 -327
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts +25 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts.map +1 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.js +99 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts +5 -3
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.js +47 -71
- package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts +10 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts.map +1 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.js +50 -0
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts +4 -5
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.js +7 -8
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +4 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +74 -3
- package/src/shade/renderer/volumetrics/NOTES.md +1023 -957
- package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.d.ts +5 -4
- package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.js +5 -4
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.d.ts +1 -1
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.js +1 -1
- package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.d.ts +1 -1
- package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.js +1 -1
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts +41 -0
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +112 -0
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +9 -23
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +18 -126
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.d.ts +22 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.js +228 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +0 -53
- package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
- package/src/shade/renderer/water/chunk_water_transport.js +7 -5
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/GPUWaterBodies.js +8 -2
- package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts +3 -2
- package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
- package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +3 -2
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +3 -1
- package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/GPUWaterSurface.js +3 -1
- package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +4 -3
- package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +17 -7
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/graph_water_tessellation.js +11 -4
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +93 -30
- package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +13 -5
- package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +29 -8
- package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +155 -30
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +6 -1
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +157 -39
- package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +91 -21
- package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/particles/shader_water_particles.js +442 -70
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +11 -3
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +3 -0
- package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
- package/src/shade/wgsl/validate_wgsl_source.js +74 -3
- package/src/engine/graphics3/register_instance_animation.d.ts +0 -114
- package/src/engine/graphics3/register_instance_animation.d.ts.map +0 -1
- package/src/engine/graphics3/register_instance_animation.js +0 -201
|
@@ -1,346 +1,349 @@
|
|
|
1
|
-
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
2
|
-
import { chunk_bc6h_pack_mode11 } from "./chunk_bc6h_pack_mode11.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Encode sixteen HDR RGB texels as one BC6H block in mode 11, the unsigned format.
|
|
6
|
-
*
|
|
7
|
-
* **The line is fitted in the half-float bit domain, because that is the domain the decoder
|
|
8
|
-
* interpolates in.** A BC6H endpoint is a half-float bit pattern quantised to ten bits; the decoder
|
|
9
|
-
* unquantises it to a sixteen-bit integer, interpolates the two ends linearly with BC7's four-bit
|
|
10
|
-
* weights, scales the result by 31/64 and reinterprets the integer *as a half*. So the palette is
|
|
11
|
-
* linear in bit patterns, not in values — which is a log-like scale, sixteen steps between two
|
|
12
|
-
* ends a few octaves apart being spaced by ratio rather than by difference. Fitting in that domain
|
|
13
|
-
* is what Narkowicz's real-time BC6H does with `f32tof16` before anything else, and it is why an
|
|
14
|
-
* error measured there is a relative error, which is what an HDR image wants judged.
|
|
15
|
-
*
|
|
16
|
-
* The fit is {@link chunk_bc1_encode_block}'s line in that domain: the principal axis, the extreme
|
|
17
|
-
* projections, two rounds of least squares with the sixteen decode weights, then quantisation to
|
|
18
|
-
* ten bits and one round of coordinate descent over the six stored components, every candidate
|
|
19
|
-
* scored against the palette the decoder builds. The anchor is honoured by writing the block the
|
|
20
|
-
* other way up when texel 0 lands in the upper half.
|
|
21
|
-
*
|
|
22
|
-
* **Mode 11 only.** It has the finest endpoints of the one-region modes and no delta to fit; the
|
|
23
|
-
* two-region modes are where a hard edge inside a block would gain, and they are a later chunk. On
|
|
24
|
-
* the environment maps the format exists for, Narkowicz measured his mode-11-only fast path within
|
|
25
|
-
* reach of offline encoders' fast presets.
|
|
26
|
-
*
|
|
27
|
-
* Half floats hold no infinity or NaN here and no sign: a negative texel clamps to zero, and
|
|
28
|
-
* anything over the largest finite half to that. The conversion to half bits is written out rather
|
|
29
|
-
* than taken from `pack2x16float`, so that the emulator and every device round the same way.
|
|
30
|
-
*
|
|
31
|
-
* @type {CodeChunk}
|
|
32
|
-
*/
|
|
33
|
-
export const chunk_bc6h_encode_block_mode11 = CodeChunk.from(
|
|
34
|
-
//language=WGSL
|
|
35
|
-
`
|
|
36
|
-
// the bit pattern of the half nearest a non-negative finite value, ties to even, as f32tof16 gives
|
|
37
|
-
fn bc6h_half_bits(x: f32) -> f32 {
|
|
38
|
-
let v = clamp(select(x, 0.0, x != x), 0.0, 65504.0);
|
|
39
|
-
|
|
40
|
-
if (v == 0.0) {
|
|
41
|
-
return 0.0;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
let bits = bitcast<u32>(v);
|
|
45
|
-
let exponent = i32((bits >> 23u) & 0xFFu) - 127;
|
|
46
|
-
|
|
47
|
-
// a half's subnormals count in units of 2^-24; the tie goes to even, written out because the
|
|
48
|
-
// emulator's round is half-up and a device's is half-even
|
|
49
|
-
if (exponent < -14) {
|
|
50
|
-
let scaled = v * 16777216.0;
|
|
51
|
-
let whole = floor(scaled);
|
|
52
|
-
let fraction = scaled - whole;
|
|
53
|
-
|
|
54
|
-
let up = fraction > 0.5 || (fraction == 0.5 && (u32(whole) & 1u) == 1u);
|
|
55
|
-
|
|
56
|
-
return whole + select(0.0, 1.0, up);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
let mantissa = bits & 0x7FFFFFu;
|
|
60
|
-
let kept = mantissa >> 13u;
|
|
61
|
-
let dropped = mantissa & 0x1FFFu;
|
|
62
|
-
|
|
63
|
-
var pattern = (u32(exponent + 15) << 10u) | kept;
|
|
64
|
-
|
|
65
|
-
if (dropped > 0x1000u || (dropped == 0x1000u && (kept & 1u) == 1u)) {
|
|
66
|
-
pattern += 1u;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return f32(min(pattern, 0x7BFFu));
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// BC7's four-bit interpolation weights, which BC6H shares
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
let
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
let
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
var
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
let
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
var
|
|
154
|
-
var
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
let
|
|
171
|
-
let
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
var
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
cov[
|
|
247
|
-
cov[
|
|
248
|
-
cov[
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
var
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
1
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
2
|
+
import { chunk_bc6h_pack_mode11 } from "./chunk_bc6h_pack_mode11.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Encode sixteen HDR RGB texels as one BC6H block in mode 11, the unsigned format.
|
|
6
|
+
*
|
|
7
|
+
* **The line is fitted in the half-float bit domain, because that is the domain the decoder
|
|
8
|
+
* interpolates in.** A BC6H endpoint is a half-float bit pattern quantised to ten bits; the decoder
|
|
9
|
+
* unquantises it to a sixteen-bit integer, interpolates the two ends linearly with BC7's four-bit
|
|
10
|
+
* weights, scales the result by 31/64 and reinterprets the integer *as a half*. So the palette is
|
|
11
|
+
* linear in bit patterns, not in values — which is a log-like scale, sixteen steps between two
|
|
12
|
+
* ends a few octaves apart being spaced by ratio rather than by difference. Fitting in that domain
|
|
13
|
+
* is what Narkowicz's real-time BC6H does with `f32tof16` before anything else, and it is why an
|
|
14
|
+
* error measured there is a relative error, which is what an HDR image wants judged.
|
|
15
|
+
*
|
|
16
|
+
* The fit is {@link chunk_bc1_encode_block}'s line in that domain: the principal axis, the extreme
|
|
17
|
+
* projections, two rounds of least squares with the sixteen decode weights, then quantisation to
|
|
18
|
+
* ten bits and one round of coordinate descent over the six stored components, every candidate
|
|
19
|
+
* scored against the palette the decoder builds. The anchor is honoured by writing the block the
|
|
20
|
+
* other way up when texel 0 lands in the upper half.
|
|
21
|
+
*
|
|
22
|
+
* **Mode 11 only.** It has the finest endpoints of the one-region modes and no delta to fit; the
|
|
23
|
+
* two-region modes are where a hard edge inside a block would gain, and they are a later chunk. On
|
|
24
|
+
* the environment maps the format exists for, Narkowicz measured his mode-11-only fast path within
|
|
25
|
+
* reach of offline encoders' fast presets.
|
|
26
|
+
*
|
|
27
|
+
* Half floats hold no infinity or NaN here and no sign: a negative texel clamps to zero, and
|
|
28
|
+
* anything over the largest finite half to that. The conversion to half bits is written out rather
|
|
29
|
+
* than taken from `pack2x16float`, so that the emulator and every device round the same way.
|
|
30
|
+
*
|
|
31
|
+
* @type {CodeChunk}
|
|
32
|
+
*/
|
|
33
|
+
export const chunk_bc6h_encode_block_mode11 = CodeChunk.from(
|
|
34
|
+
//language=WGSL
|
|
35
|
+
`
|
|
36
|
+
// the bit pattern of the half nearest a non-negative finite value, ties to even, as f32tof16 gives
|
|
37
|
+
fn bc6h_half_bits(x: f32) -> f32 {
|
|
38
|
+
let v = clamp(select(x, 0.0, x != x), 0.0, 65504.0);
|
|
39
|
+
|
|
40
|
+
if (v == 0.0) {
|
|
41
|
+
return 0.0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
let bits = bitcast<u32>(v);
|
|
45
|
+
let exponent = i32((bits >> 23u) & 0xFFu) - 127;
|
|
46
|
+
|
|
47
|
+
// a half's subnormals count in units of 2^-24; the tie goes to even, written out because the
|
|
48
|
+
// emulator's round is half-up and a device's is half-even
|
|
49
|
+
if (exponent < -14) {
|
|
50
|
+
let scaled = v * 16777216.0;
|
|
51
|
+
let whole = floor(scaled);
|
|
52
|
+
let fraction = scaled - whole;
|
|
53
|
+
|
|
54
|
+
let up = fraction > 0.5 || (fraction == 0.5 && (u32(whole) & 1u) == 1u);
|
|
55
|
+
|
|
56
|
+
return whole + select(0.0, 1.0, up);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
let mantissa = bits & 0x7FFFFFu;
|
|
60
|
+
let kept = mantissa >> 13u;
|
|
61
|
+
let dropped = mantissa & 0x1FFFu;
|
|
62
|
+
|
|
63
|
+
var pattern = (u32(exponent + 15) << 10u) | kept;
|
|
64
|
+
|
|
65
|
+
if (dropped > 0x1000u || (dropped == 0x1000u && (kept & 1u) == 1u)) {
|
|
66
|
+
pattern += 1u;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return f32(min(pattern, 0x7BFFu));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// BC7's four-bit interpolation weights, which BC6H shares: 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43,
|
|
73
|
+
// 47, 51, 55, 60, 64, every one of which this computes. Computed rather than looked up, as
|
|
74
|
+
// bc7_weight4 is: a function-local table indexed at run time lives in local memory, and it was an
|
|
75
|
+
// eighth of this encoder's time on a 4090
|
|
76
|
+
fn bc6h_weight4(index: u32) -> f32 {
|
|
77
|
+
return f32((index * 64u + 7u) / 15u);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// a ten-bit endpoint as the decoder unquantises it before interpolating
|
|
81
|
+
fn bc6h_unquantize(q: vec3<f32>) -> vec3<f32> {
|
|
82
|
+
let scaled = floor((q * 65536.0 + 32768.0) / 1024.0);
|
|
83
|
+
|
|
84
|
+
return select(select(scaled, vec3<f32>(65535.0), q >= vec3<f32>(1023.0)), vec3<f32>(0.0), q <= vec3<f32>(0.0));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// a palette entry, as half bits, from two unquantised ends
|
|
88
|
+
fn bc6h_palette_entry(u0: vec3<f32>, u1: vec3<f32>, index: u32) -> vec3<f32> {
|
|
89
|
+
let w = bc6h_weight4(index);
|
|
90
|
+
|
|
91
|
+
let interpolated = floor((u0 * (64.0 - w) + u1 * w + 32.0) / 64.0);
|
|
92
|
+
|
|
93
|
+
return floor(interpolated * 31.0 / 64.0);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// a value in half bits quantised to the ten bits the block stores
|
|
97
|
+
fn bc6h_quantize(bits: vec3<f32>) -> vec3<f32> {
|
|
98
|
+
return clamp(round(bits * 1024.0 / 31744.0), vec3<f32>(0.0), vec3<f32>(1023.0));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// the index whose palette entry is nearest a texel, and the squared distance in half bits
|
|
102
|
+
fn bc6h_nearest(u0: vec3<f32>, u1: vec3<f32>, texel: vec3<f32>) -> vec2<f32> {
|
|
103
|
+
let p0 = bc6h_palette_entry(u0, u1, 0u);
|
|
104
|
+
let p15 = bc6h_palette_entry(u0, u1, 15u);
|
|
105
|
+
|
|
106
|
+
let direction = p15 - p0;
|
|
107
|
+
let span = dot(direction, direction);
|
|
108
|
+
|
|
109
|
+
var estimate = 0.0;
|
|
110
|
+
|
|
111
|
+
if (span > 0.0) {
|
|
112
|
+
estimate = clamp(round(dot(texel - p0, direction) / span * 15.0), 0.0, 15.0);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
var best = estimate;
|
|
116
|
+
var best_distance = 1e30;
|
|
117
|
+
|
|
118
|
+
// counted in integers: counted in floats, the same loops made the whole encoder a fifth slower on
|
|
119
|
+
// an RTX 4090, the bytes identical
|
|
120
|
+
for (var offset = -1; offset <= 1; offset++) {
|
|
121
|
+
let candidate = clamp(estimate + f32(offset), 0.0, 15.0);
|
|
122
|
+
|
|
123
|
+
let delta = bc6h_palette_entry(u0, u1, u32(candidate)) - texel;
|
|
124
|
+
let distance = dot(delta, delta);
|
|
125
|
+
|
|
126
|
+
if (distance < best_distance) {
|
|
127
|
+
best_distance = distance;
|
|
128
|
+
best = candidate;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return vec2<f32>(best, best_distance);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
fn bc6h_score(texels: array<vec3<f32>, 16>, q0: vec3<f32>, q1: vec3<f32>) -> f32 {
|
|
136
|
+
let u0 = bc6h_unquantize(q0);
|
|
137
|
+
let u1 = bc6h_unquantize(q1);
|
|
138
|
+
|
|
139
|
+
var error = 0.0;
|
|
140
|
+
|
|
141
|
+
for (var i = 0u; i < 16u; i++) {
|
|
142
|
+
error += bc6h_nearest(u0, u1, texels[i]).y;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return error;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// the ends that best reproduce the texels at the weights they are nearest to on a real line
|
|
149
|
+
fn bc6h_refine(texels: array<vec3<f32>, 16>, e0: vec3<f32>, e1: vec3<f32>) -> array<vec3<f32>, 2> {
|
|
150
|
+
let direction = e1 - e0;
|
|
151
|
+
let span = dot(direction, direction);
|
|
152
|
+
|
|
153
|
+
var aa = 0.0;
|
|
154
|
+
var ab = 0.0;
|
|
155
|
+
var bb = 0.0;
|
|
156
|
+
var ap = vec3<f32>(0.0);
|
|
157
|
+
var bp = vec3<f32>(0.0);
|
|
158
|
+
|
|
159
|
+
for (var i = 0u; i < 16u; i++) {
|
|
160
|
+
var estimate = 0.0;
|
|
161
|
+
|
|
162
|
+
if (span > 0.0) {
|
|
163
|
+
estimate = clamp(round(dot(texels[i] - e0, direction) / span * 15.0), 0.0, 15.0);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
var best_weight = 0.0;
|
|
167
|
+
var best_distance = 1e30;
|
|
168
|
+
|
|
169
|
+
for (var offset = -1; offset <= 1; offset++) {
|
|
170
|
+
let candidate = clamp(estimate + f32(offset), 0.0, 15.0);
|
|
171
|
+
let weight = bc6h_weight4(u32(candidate)) / 64.0;
|
|
172
|
+
|
|
173
|
+
let delta = mix(e0, e1, weight) - texels[i];
|
|
174
|
+
let distance = dot(delta, delta);
|
|
175
|
+
|
|
176
|
+
if (distance < best_distance) {
|
|
177
|
+
best_distance = distance;
|
|
178
|
+
best_weight = weight;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
let b = best_weight;
|
|
183
|
+
let a = 1.0 - b;
|
|
184
|
+
|
|
185
|
+
aa += a * a;
|
|
186
|
+
ab += a * b;
|
|
187
|
+
bb += b * b;
|
|
188
|
+
ap += a * texels[i];
|
|
189
|
+
bp += b * texels[i];
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
let determinant = aa * bb - ab * ab;
|
|
193
|
+
|
|
194
|
+
var out: array<vec3<f32>, 2>;
|
|
195
|
+
|
|
196
|
+
if (abs(determinant) < 1e-6) {
|
|
197
|
+
out[0] = e0;
|
|
198
|
+
out[1] = e1;
|
|
199
|
+
|
|
200
|
+
return out;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
out[0] = (bb * ap - ab * bp) / determinant;
|
|
204
|
+
out[1] = (aa * bp - ab * ap) / determinant;
|
|
205
|
+
|
|
206
|
+
return out;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
fn bc6h_with_component(v: vec3<f32>, channel: u32, value: f32) -> vec3<f32> {
|
|
210
|
+
return vec3<f32>(
|
|
211
|
+
select(v.x, value, channel == 0u),
|
|
212
|
+
select(v.y, value, channel == 1u),
|
|
213
|
+
select(v.z, value, channel == 2u)
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
fn bc6h_encode_block_mode11(texels: array<vec3<f32>, 16>) -> vec4<u32> {
|
|
218
|
+
var bits: array<vec3<f32>, 16>;
|
|
219
|
+
|
|
220
|
+
var low = vec3<f32>(65535.0);
|
|
221
|
+
var high = vec3<f32>(0.0);
|
|
222
|
+
var mean = vec3<f32>(0.0);
|
|
223
|
+
|
|
224
|
+
for (var i = 0u; i < 16u; i++) {
|
|
225
|
+
let v = vec3<f32>(bc6h_half_bits(texels[i].x), bc6h_half_bits(texels[i].y), bc6h_half_bits(texels[i].z));
|
|
226
|
+
|
|
227
|
+
bits[i] = v;
|
|
228
|
+
low = min(low, v);
|
|
229
|
+
high = max(high, v);
|
|
230
|
+
mean += v;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
mean = mean / 16.0;
|
|
234
|
+
|
|
235
|
+
let extent = high - low;
|
|
236
|
+
|
|
237
|
+
var e0 = mean;
|
|
238
|
+
var e1 = mean;
|
|
239
|
+
|
|
240
|
+
if (max(extent.x, max(extent.y, extent.z)) >= 0.5) {
|
|
241
|
+
var cov = array<f32, 6>(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
|
|
242
|
+
|
|
243
|
+
for (var i = 0u; i < 16u; i++) {
|
|
244
|
+
let d = bits[i] - mean;
|
|
245
|
+
|
|
246
|
+
cov[0] += d.x * d.x;
|
|
247
|
+
cov[1] += d.x * d.y;
|
|
248
|
+
cov[2] += d.x * d.z;
|
|
249
|
+
cov[3] += d.y * d.y;
|
|
250
|
+
cov[4] += d.y * d.z;
|
|
251
|
+
cov[5] += d.z * d.z;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
var axis = extent;
|
|
255
|
+
|
|
256
|
+
for (var iteration = 0u; iteration < 4u; iteration++) {
|
|
257
|
+
let next = vec3<f32>(
|
|
258
|
+
cov[0] * axis.x + cov[1] * axis.y + cov[2] * axis.z,
|
|
259
|
+
cov[1] * axis.x + cov[3] * axis.y + cov[4] * axis.z,
|
|
260
|
+
cov[2] * axis.x + cov[4] * axis.y + cov[5] * axis.z
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
let magnitude = length(next);
|
|
264
|
+
|
|
265
|
+
if (magnitude < 1e-3) {
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
axis = next / magnitude;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
axis = normalize(axis);
|
|
273
|
+
|
|
274
|
+
var t_min = 1e30;
|
|
275
|
+
var t_max = -1e30;
|
|
276
|
+
|
|
277
|
+
for (var i = 0u; i < 16u; i++) {
|
|
278
|
+
let t = dot(bits[i] - mean, axis);
|
|
279
|
+
|
|
280
|
+
t_min = min(t_min, t);
|
|
281
|
+
t_max = max(t_max, t);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
e0 = mean + axis * t_min;
|
|
285
|
+
e1 = mean + axis * t_max;
|
|
286
|
+
|
|
287
|
+
for (var round = 0u; round < 2u; round++) {
|
|
288
|
+
let refined = bc6h_refine(bits, e0, e1);
|
|
289
|
+
|
|
290
|
+
e0 = clamp(refined[0], vec3<f32>(0.0), vec3<f32>(31743.0));
|
|
291
|
+
e1 = clamp(refined[1], vec3<f32>(0.0), vec3<f32>(31743.0));
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
var q0 = bc6h_quantize(e0);
|
|
296
|
+
var q1 = bc6h_quantize(e1);
|
|
297
|
+
|
|
298
|
+
var best = bc6h_score(bits, q0, q1);
|
|
299
|
+
|
|
300
|
+
// coordinate descent over the six stored components, one round
|
|
301
|
+
for (var component = 0u; component < 6u; component++) {
|
|
302
|
+
let channel = component % 3u;
|
|
303
|
+
|
|
304
|
+
for (var direction = -1; direction <= 1; direction += 2) {
|
|
305
|
+
var c0 = q0;
|
|
306
|
+
var c1 = q1;
|
|
307
|
+
|
|
308
|
+
if (component < 3u) {
|
|
309
|
+
c0 = bc6h_with_component(q0, channel, clamp(q0[channel] + f32(direction), 0.0, 1023.0));
|
|
310
|
+
} else {
|
|
311
|
+
c1 = bc6h_with_component(q1, channel, clamp(q1[channel] + f32(direction), 0.0, 1023.0));
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
let error = bc6h_score(bits, c0, c1);
|
|
315
|
+
|
|
316
|
+
if (error < best) {
|
|
317
|
+
best = error;
|
|
318
|
+
q0 = c0;
|
|
319
|
+
q1 = c1;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
var indices: array<u32, 16>;
|
|
325
|
+
|
|
326
|
+
let u0 = bc6h_unquantize(q0);
|
|
327
|
+
let u1 = bc6h_unquantize(q1);
|
|
328
|
+
|
|
329
|
+
for (var i = 0u; i < 16u; i++) {
|
|
330
|
+
indices[i] = u32(bc6h_nearest(u0, u1, bits[i]).x);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// the anchor: texel 0's top bit is implied zero
|
|
334
|
+
if (indices[0] >= 8u) {
|
|
335
|
+
let swap = q0;
|
|
336
|
+
|
|
337
|
+
q0 = q1;
|
|
338
|
+
q1 = swap;
|
|
339
|
+
|
|
340
|
+
for (var i = 0u; i < 16u; i++) {
|
|
341
|
+
indices[i] = 15u - indices[i];
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
return bc6h_pack_mode11(vec3<u32>(q0), vec3<u32>(q1), indices);
|
|
346
|
+
}
|
|
347
|
+
`, [
|
|
348
|
+
chunk_bc6h_pack_mode11,
|
|
349
|
+
]);
|