@woosh/meep-engine 3.39.0 → 3.41.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/build/bundle-worker-terrain.js +1 -1
- package/package.json +1 -1
- package/src/core/geom/3d/quaternion/swing_twist_clamp.d.ts +24 -0
- package/src/core/geom/3d/quaternion/swing_twist_clamp.d.ts.map +1 -0
- package/src/core/geom/3d/quaternion/swing_twist_clamp.js +62 -0
- package/src/core/geom/3d/quaternion/swing_twist_compose.d.ts +15 -0
- package/src/core/geom/3d/quaternion/swing_twist_compose.d.ts.map +1 -0
- package/src/core/geom/3d/quaternion/swing_twist_compose.js +36 -0
- package/src/core/geom/3d/quaternion/swing_twist_error.d.ts +39 -0
- package/src/core/geom/3d/quaternion/swing_twist_error.d.ts.map +1 -0
- package/src/core/geom/3d/quaternion/swing_twist_error.js +85 -0
- package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.d.ts +11 -6
- package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.d.ts.map +1 -1
- package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.js +27 -13
- package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.d.ts +25 -0
- package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.d.ts.map +1 -0
- package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.js +166 -0
- package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.d.ts +5 -3
- package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.d.ts.map +1 -1
- package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.js +5 -3
- package/src/engine/EngineHarness.d.ts.map +1 -1
- package/src/engine/EngineHarness.js +17 -4
- package/src/engine/animation/curve/AnimationCurve.d.ts +3 -0
- package/src/engine/animation/curve/AnimationCurve.d.ts.map +1 -1
- package/src/engine/animation/curve/AnimationCurve.js +6 -1
- package/src/engine/asset/loaders/image/avif/threaded_image_encoder.js +1 -1
- package/src/engine/ecs/EntityManager.d.ts +9 -1
- package/src/engine/ecs/EntityManager.d.ts.map +1 -1
- package/src/engine/ecs/EntityManager.js +26 -27
- package/src/engine/ecs/gpu/GPUStateAuthority.d.ts +20 -0
- package/src/engine/ecs/gpu/GPUStateAuthority.d.ts.map +1 -1
- package/src/engine/ecs/gpu/GPUStateAuthority.js +21 -0
- package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.d.ts +13 -0
- package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.d.ts.map +1 -0
- package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.js +12 -0
- package/src/engine/ecs/gpu/gpu_authority_grant.d.ts +6 -0
- package/src/engine/ecs/gpu/gpu_authority_grant.d.ts.map +1 -1
- package/src/engine/ecs/gpu/gpu_authority_grant.js +7 -1
- package/src/engine/ecs/gpu/gpu_authority_held.d.ts +14 -0
- package/src/engine/ecs/gpu/gpu_authority_held.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_held.js +23 -0
- package/src/engine/ecs/gpu/gpu_authority_hold.d.ts +23 -0
- package/src/engine/ecs/gpu/gpu_authority_hold.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_hold.js +41 -0
- package/src/engine/ecs/gpu/gpu_authority_unhold.d.ts +14 -0
- package/src/engine/ecs/gpu/gpu_authority_unhold.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_unhold.js +32 -0
- package/src/engine/ecs/ik/IKGoal.d.ts +59 -0
- package/src/engine/ecs/ik/IKGoal.d.ts.map +1 -0
- package/src/engine/ecs/ik/IKGoal.js +83 -0
- package/src/engine/ecs/ik/IKGoalSystem.d.ts +75 -0
- package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -0
- package/src/engine/ecs/ik/IKGoalSystem.js +1456 -0
- package/src/engine/ecs/ik/PLAN.md +179 -0
- package/src/engine/ecs/speaker/VoiceSystem.d.ts +2 -2
- package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
- package/src/engine/ecs/storage/BinaryBufferSerializer.d.ts.map +1 -1
- package/src/engine/ecs/storage/BinaryBufferSerializer.js +4 -5
- package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +7 -3
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +5 -2
- package/src/engine/ecs/system/orderSystemsByDeclaredAccess.d.ts +33 -0
- package/src/engine/ecs/system/orderSystemsByDeclaredAccess.d.ts.map +1 -0
- package/src/engine/ecs/system/orderSystemsByDeclaredAccess.js +282 -0
- package/src/engine/ecs/transform/T64WorldCache.js +139 -139
- package/src/engine/ecs/transform/t64_evaluate_local.d.ts +25 -0
- package/src/engine/ecs/transform/t64_evaluate_local.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_evaluate_local.js +35 -0
- package/src/engine/ecs/transform/t64_evaluate_world.d.ts +5 -3
- package/src/engine/ecs/transform/t64_evaluate_world.d.ts.map +1 -1
- package/src/engine/ecs/transform/t64_evaluate_world.js +128 -126
- package/src/engine/graphics/ecs/water/Water.d.ts +14 -17
- package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/Water.js +100 -110
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +36 -38
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts +6 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts.map +1 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.js +10 -0
- package/src/engine/graphics/ecs/water/WaterWaves.d.ts +3 -3
- package/src/engine/graphics/ecs/water/WaterWaves.js +46 -46
- package/src/engine/graphics/texture/sampler/sampler2d_to_avif.d.ts.map +1 -1
- package/src/engine/graphics/texture/sampler/sampler2d_to_avif.js +8 -5
- package/src/engine/graphics3/AnimationGraphSystem.d.ts +2 -0
- package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.js +337 -329
- package/src/engine/graphics3/AnimationSystem.d.ts +2 -0
- package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationSystem.js +360 -352
- package/src/engine/graphics3/WaterSystem.d.ts +21 -74
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem.js +174 -367
- package/src/engine/physics/cloth/MEASUREMENTS.md +130 -0
- package/src/engine/physics/cloth/PLAN.md +16 -1
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +5 -6
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +5 -6
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +4 -7
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +4 -7
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +4 -3
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.js +4 -3
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.js +10 -0
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +24 -24
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +46 -43
- package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +1 -1
- package/src/engine/physics/cloth/ecs/cloth_write_back.js +1 -1
- package/src/engine/physics/constraint/solve_constraints.d.ts +0 -35
- package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
- package/src/engine/physics/constraint/solve_constraints.js +1 -83
- package/src/engine/physics/ecs/ContactProbe.d.ts +73 -0
- package/src/engine/physics/ecs/ContactProbe.d.ts.map +1 -0
- package/src/engine/physics/ecs/ContactProbe.js +103 -0
- package/src/engine/physics/ecs/ContactProbeSystem.d.ts +44 -0
- package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -0
- package/src/engine/physics/ecs/ContactProbeSystem.js +397 -0
- package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +1 -1
- package/src/engine/physics/fluid/ecs/FluidComponent.js +1 -1
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.d.ts +205 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.d.ts.map +1 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.js +245 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.d.ts +21 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.d.ts.map +1 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.js +63 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts +33 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts.map +1 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.js +874 -0
- package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.d.ts +27 -0
- package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.d.ts.map +1 -0
- package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.js +77 -0
- package/src/engine/physics/inverse_kinematics/two_bone_path_solve.d.ts +36 -0
- package/src/engine/physics/inverse_kinematics/two_bone_path_solve.d.ts.map +1 -0
- package/src/engine/physics/inverse_kinematics/two_bone_path_solve.js +97 -0
- package/src/engine/physics/inverse_kinematics/two_joint_ik.d.ts +33 -11
- package/src/engine/physics/inverse_kinematics/two_joint_ik.d.ts.map +1 -1
- package/src/engine/physics/inverse_kinematics/two_joint_ik.js +158 -67
- package/src/format/image/avif/api/convert_to_rgba.d.ts +2 -2
- package/src/format/image/avif/api/convert_to_rgba.d.ts.map +1 -1
- package/src/format/image/avif/api/convert_to_rgba.js +10 -9
- package/src/format/image/avif/api/decode_avif.d.ts +2 -2
- package/src/format/image/avif/api/decode_avif.d.ts.map +1 -1
- package/src/format/image/avif/api/decode_avif.js +1 -1
- package/src/shade/playground/ssr_reprojection/README.md +111 -103
- package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.js +68 -68
- package/src/shade/playground/ssr_reprojection/index.html +80 -79
- package/src/shade/playground/ssr_reprojection/main.js +256 -247
- package/src/shade/playground/ssr_variance/capture.js +96 -96
- package/src/shade/playground/ssr_variance/reference.js +78 -78
- package/src/shade/playground/vsm/README.md +96 -0
- package/src/shade/playground/vsm/VSMDebugOverlay.d.ts +49 -0
- package/src/shade/playground/vsm/VSMDebugOverlay.d.ts.map +1 -0
- package/src/shade/playground/vsm/VSMDebugOverlay.js +351 -0
- package/src/shade/playground/vsm/clipmap_panel.d.ts +8 -0
- package/src/shade/playground/vsm/clipmap_panel.d.ts.map +1 -0
- package/src/shade/playground/vsm/clipmap_panel.js +138 -0
- package/src/shade/playground/vsm/index.html +170 -0
- package/src/shade/playground/vsm/main.d.ts +2 -0
- package/src/shade/playground/vsm/main.d.ts.map +1 -0
- package/src/shade/playground/vsm/main.js +389 -0
- package/src/shade/playground/vsm/scenes.d.ts +52 -0
- package/src/shade/playground/vsm/scenes.d.ts.map +1 -0
- package/src/shade/playground/vsm/scenes.js +320 -0
- package/src/shade/playground/vsm/verify_vsm.d.ts +38 -0
- package/src/shade/playground/vsm/verify_vsm.d.ts.map +1 -0
- package/src/shade/playground/vsm/verify_vsm.js +305 -0
- package/src/shade/playground/water_refraction/README.md +57 -9
- package/src/shade/playground/water_refraction/main.js +12 -3
- package/src/shade/playground/water_refraction/world.d.ts +1 -0
- package/src/shade/playground/water_refraction/world.d.ts.map +1 -1
- package/src/shade/playground/water_refraction/world.js +15 -5
- package/src/shade/renderer/Renderer.d.ts +19 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +72 -1
- package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.js +10 -1
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +18 -4
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +269 -23
- package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts +12 -4
- package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts.map +1 -1
- package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js +12 -4
- package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
- package/src/shade/renderer/animation/chunk_pose_accumulator.js +14 -1
- package/src/shade/renderer/animation/pose/PoseChannelIndex.d.ts +78 -0
- package/src/shade/renderer/animation/pose/PoseChannelIndex.d.ts.map +1 -0
- package/src/shade/renderer/animation/pose/PoseChannelIndex.js +274 -0
- package/src/shade/renderer/animation/pose/PosePlayback.d.ts +40 -3
- package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
- package/src/shade/renderer/animation/pose/PosePlayback.js +77 -3
- package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts +21 -3
- package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
- package/src/shade/renderer/animation/pose/pose_evaluate_local.js +79 -11
- package/src/shade/renderer/animation/shader_animation_apply.js +1 -1
- package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts +3 -2
- package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
- package/src/shade/renderer/animation/shader_animation_pose_resolve.js +187 -176
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +7 -0
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -0
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts +3 -1
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +10 -1
- package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.js +28 -0
- package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.js +31 -1
- package/src/shade/renderer/geometry/MeshletGeometry.d.ts +3 -0
- package/src/shade/renderer/geometry/MeshletGeometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/MeshletGeometry.js +1 -0
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +62 -4
- package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
- package/src/shade/renderer/light/environment/rgbe/parse_rgbe.js +2 -2
- package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts +2 -2
- package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.js +6 -14
- package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.js +5 -1
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/medium/ParticipatingMedium.d.ts +3 -0
- package/src/shade/renderer/medium/ParticipatingMedium.d.ts.map +1 -1
- package/src/shade/renderer/medium/ParticipatingMedium.js +7 -0
- package/src/shade/renderer/object_property/chunk_write_object_property.d.ts +3 -1
- package/src/shade/renderer/object_property/chunk_write_object_property.d.ts.map +1 -1
- package/src/shade/renderer/object_property/chunk_write_object_property.js +5 -2
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +4 -0
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +6 -1
- package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.js +5 -35
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts +12 -4
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/SSR.js +36 -8
- package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts +3 -0
- package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.js +2 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts +8 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.js +40 -0
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +150 -137
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts +3 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.js +44 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts +5 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.js +35 -0
- package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts +26 -0
- package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.js +42 -0
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +1 -0
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +113 -105
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts +2 -0
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +177 -167
- package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.js +10 -0
- package/src/shade/renderer/rasterize/RasterizationJob.d.ts +1 -2
- package/src/shade/renderer/rasterize/RasterizationJob.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/RasterizationJob.js +1 -2
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +5 -6
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +5 -6
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +2 -2
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +1 -1
- package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +11 -0
- package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts +1 -1
- package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.js +135 -73
- package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts +7 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js +29 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.d.ts +19 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.d.ts.map +1 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.js +167 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.d.ts +25 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.d.ts.map +1 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.js +124 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.d.ts +19 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.d.ts.map +1 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.js +48 -0
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +17 -1
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
- package/src/shade/renderer/scene/rows/GPUSceneRows.js +29 -3
- package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.js +4 -5
- package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.js +1 -5
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts +30 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.js +54 -0
- package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
- package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +3 -2
- package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts +19 -0
- package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.js +27 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +1 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +4 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +54 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +502 -10
- package/src/shade/renderer/shadow/map/Shadowmap.d.ts +3 -2
- package/src/shade/renderer/shadow/map/Shadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/Shadowmap.js +3 -2
- package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts +8 -0
- package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.js +34 -3
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts +3 -2
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js +17 -2
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js +137 -133
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts +15 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.js +14 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts +16 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.js +15 -0
- package/src/shade/renderer/shadow/vsm/PLAN.md +440 -0
- package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +43 -0
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +42 -0
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.js +153 -0
- package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +327 -0
- package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSMPageManager.js +1408 -0
- package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts +14 -0
- package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.js +13 -0
- package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts +63 -0
- package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.js +70 -0
- package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts +11 -0
- package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.js +10 -0
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +54 -0
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.js +75 -0
- package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts +23 -0
- package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.js +85 -0
- package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts +16 -0
- package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.js +29 -0
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts +136 -25
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.js +282 -116
- package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts +39 -0
- package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.js +289 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts +18 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.js +65 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts +17 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.js +75 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +14 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.js +45 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts +17 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.js +100 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts +15 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.js +47 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts +26 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.js +156 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts +13 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.js +65 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +30 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.js +184 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +23 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.js +109 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts +56 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.js +211 -0
- package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts +1 -1
- package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts.map +1 -1
- package/src/shade/renderer/texture/format/decode_typed_gpu_data.js +3 -13
- package/src/shade/renderer/texture/format/infer_format_from_parameters.d.ts.map +1 -1
- package/src/shade/renderer/texture/format/infer_format_from_parameters.js +2 -3
- package/src/shade/renderer/texture/texture_write_to_gpu.d.ts.map +1 -1
- package/src/shade/renderer/texture/texture_write_to_gpu.js +16 -16
- package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts +4 -90
- package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts.map +1 -1
- package/src/shade/renderer/texture/virtual/VTPhysicalCache.js +6 -210
- package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts +119 -0
- package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts.map +1 -0
- package/src/shade/renderer/texture/virtual/VTPhysicalSlots.js +245 -0
- package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts +1 -1
- package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts.map +1 -1
- package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.js +3 -19
- package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts +13 -0
- package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts.map +1 -0
- package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.js +34 -0
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +7 -2
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +49 -49
- package/src/shade/renderer/water/chunk_water_transport.js +3 -3
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +11 -25
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/GPUWaterBodies.js +64 -116
- package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts +1 -20
- package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.js +10 -42
- package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts +3 -0
- package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts.map +1 -0
- package/src/shade/renderer/water/medium/chunk_water_bodies.js +3 -0
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +1 -5
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +32 -30
- package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +4 -0
- package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -0
- package/src/shade/renderer/water/medium/shader_water_meshlets.js +69 -0
- package/src/shade/renderer/water/optics/chunk_water_inscatter.d.ts.map +1 -1
- package/src/shade/renderer/water/optics/chunk_water_inscatter.js +124 -123
- 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 +75 -74
- package/src/shade/renderer/water/shader_water.d.ts +1 -1
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +490 -406
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +12 -85
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +128 -408
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +6 -0
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +23 -0
- package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +9 -0
- package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/chunk_water_tessellation.js +144 -0
- package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +3 -5
- package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/chunk_water_wave.js +40 -48
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +14 -0
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/graph_water_tessellation.js +34 -0
- package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +4 -0
- package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_tiles.js +123 -0
- package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +6 -0
- package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_wave_batch.js +85 -0
- package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +6 -0
- package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_wave_domain.js +83 -0
- package/src/shade/renderer/water/water_height_texture_from_sampler.d.ts.map +1 -1
- package/src/shade/renderer/water/water_height_texture_from_sampler.js +4 -3
- package/src/engine/ecs/ik/IKConstraint.d.ts +0 -52
- package/src/engine/ecs/ik/IKConstraint.d.ts.map +0 -1
- package/src/engine/ecs/ik/IKConstraint.js +0 -95
- package/src/engine/ecs/ik/IKProblem.d.ts +0 -45
- package/src/engine/ecs/ik/IKProblem.d.ts.map +0 -1
- package/src/engine/ecs/ik/IKProblem.js +0 -58
- package/src/engine/ecs/ik/IKSolver.d.ts +0 -8
- package/src/engine/ecs/ik/IKSolver.d.ts.map +0 -1
- package/src/engine/ecs/ik/IKSolver.js +0 -9
- package/src/engine/ecs/ik/InverseKinematics.d.ts +0 -48
- package/src/engine/ecs/ik/InverseKinematics.d.ts.map +0 -1
- package/src/engine/ecs/ik/InverseKinematics.js +0 -119
- package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.d.ts +0 -19
- package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.d.ts.map +0 -1
- package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.js +0 -72
- package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts +0 -54
- package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +0 -1
- package/src/engine/ecs/ik/InverseKinematicsSystem.js +0 -212
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts +0 -8
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts.map +0 -1
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +0 -153
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts +0 -5
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts.map +0 -1
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +0 -120
- package/src/engine/ecs/ik/ik_bone_chain.d.ts +0 -64
- package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +0 -1
- package/src/engine/ecs/ik/ik_bone_chain.js +0 -142
- package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts +0 -42
- package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts.map +0 -1
- package/src/engine/ecs/ik/ik_probe_terrain_contact.js +0 -123
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +0 -18
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +0 -1
- package/src/engine/ecs/ik/ik_write_local_rotation.js +0 -32
- package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts +0 -2
- package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts.map +0 -1
- package/src/engine/graphics/ecs/water/WATER_SIZE.js +0 -1
- package/src/shade/renderer/light/GPUViewLightContext.d.ts +0 -22
- package/src/shade/renderer/light/GPUViewLightContext.d.ts.map +0 -1
- package/src/shade/renderer/light/GPUViewLightContext.js +0 -62
- package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts +0 -14
- package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.js +0 -20
- package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts +0 -27
- package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.js +0 -147
- package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts +0 -7
- package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.js +0 -10
- package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts +0 -2
- package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.js +0 -1
- package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts +0 -3
- package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.js +0 -8
- package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts +0 -27
- package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.js +0 -102
- package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts +0 -8
- package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.js +0 -34
- package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts +0 -10
- package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.js +0 -64
- package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts +0 -11
- package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/decode_tile_address.js +0 -26
- package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts +0 -2
- package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.js +0 -11
- package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts +0 -20
- package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.js +0 -184
- package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts +0 -25
- package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.js +0 -230
- package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts +0 -19
- package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.js +0 -127
- package/src/shade/renderer/texture/encode/ENCODE_NOTES_2026_09_02.md +0 -462
- package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts +0 -23
- package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts.map +0 -1
- package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts +0 -18
- package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts +0 -12
- package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.js +0 -27
- package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts +0 -14
- package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.js +0 -49
- package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts +0 -9
- package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/chunk_water_wave_grid.js +0 -47
- package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts +0 -10
- package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/shader_water_surface_write.js +0 -51
- package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts +0 -12
- package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/shader_water_wave_step.js +0 -54
- package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts +0 -13
- package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/water_surface_grid_indices.js +0 -39
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
import { RenderExtension } from "../../renderer/extension/RenderExtension.js";
|
|
2
|
-
import { FramePhase } from "../../renderer/extension/FramePhase.js";
|
|
3
|
-
import { SceneColor } from "../../renderer/extension/SceneColor.js";
|
|
4
|
-
import { ImageShader } from "../../renderer/shader/ImageShader.js";
|
|
5
|
-
import { CodeChunk } from "../../renderer/shader/compiler/CodeChunk.js";
|
|
6
|
-
import { chunk_decode_g_buffer_normal } from "../../renderer/shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
|
|
7
|
-
import { graph_image_pass } from "../../renderer/shader/graph/graph_image_pass.js";
|
|
8
|
-
import { graph_import_texture } from "../../renderer/shader/graph/graph_import_texture.js";
|
|
9
|
-
import { ShaderResourceSetDescriptor } from "../../renderer/shader/resource/ShaderResourceSetDescriptor.js";
|
|
10
|
-
import { ShaderDescriptor } from "../../renderer/shader/ShaderDescriptor.js";
|
|
11
|
-
import { GPUTextureContext } from "../../renderer/texture/GPUTextureContext.js";
|
|
12
|
-
import { download_texture_data } from "../../renderer/texture/download_texture_data.js";
|
|
13
|
-
|
|
14
|
-
const resources = new ShaderResourceSetDescriptor();
|
|
15
|
-
resources.createGroup().addTexture('tSource', 'unfilterable-float').addTexture('tNormal', 'uint');
|
|
16
|
-
const shader = new ImageShader({
|
|
17
|
-
descriptor: ShaderDescriptor.from({ label: 'SSR variance / capture', resources,
|
|
18
|
-
body: CodeChunk.from(/* language=WGSL */ `
|
|
19
|
-
struct Capture { @location(0) radiance: vec4f, @location(1) mask: vec4f }
|
|
20
|
-
@fragment fn main(@builtin(position) coord: vec4f) -> Capture {
|
|
21
|
-
let p = vec2i(coord.xy);
|
|
22
|
-
var output: Capture;
|
|
23
|
-
output.radiance = textureLoad(tSource, p, 0);
|
|
24
|
-
output.mask = vec4f(select(0.0, 1.0, decode_g_buffer_normal(textureLoad(tNormal, p, 0).xy).y > 0.99));
|
|
25
|
-
return output;
|
|
26
|
-
}`, [chunk_decode_g_buffer_normal]) }),
|
|
27
|
-
targets: [{ format: 'rgba32float' }, { format: 'rgba32float' }],
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
/** TAA-off currently leaves raster jitter active. Freeze only this lab's view before rasterization. */
|
|
31
|
-
export class FixedProjection extends RenderExtension {
|
|
32
|
-
name = 'SSR variance / fixed projection';
|
|
33
|
-
phase = FramePhase.FrameStart;
|
|
34
|
-
record(frame) {
|
|
35
|
-
frame.view.setJitter(0, 0);
|
|
36
|
-
frame.view.camera.setViewportOffset(0, 0);
|
|
37
|
-
frame.view.camera.update();
|
|
38
|
-
frame.view.update_uniforms();
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/** Exact textureLoad copies of production SSR stages, only on requested frames. */
|
|
43
|
-
export class CaptureSSR extends RenderExtension {
|
|
44
|
-
name = 'SSR variance / capture';
|
|
45
|
-
phase = FramePhase.BeforePresent;
|
|
46
|
-
enabled = false;
|
|
47
|
-
textures = new Map();
|
|
48
|
-
constructor(device) { super(); this.device = device; }
|
|
49
|
-
record(frame) {
|
|
50
|
-
if (!this.enabled) { return; }
|
|
51
|
-
this.jitter = Array.from(frame.view.jitter);
|
|
52
|
-
const passes = frame.graph.__pass_nodes;
|
|
53
|
-
const resolve = passes.find(p => p.name === 'SSR resolve / IBL');
|
|
54
|
-
const spatial1 = passes.find(p => p.name
|
|
55
|
-
const temporal = passes.find(p => p.name
|
|
56
|
-
const spatial = passes.filter(p => p.name === 'SSR / spatial denoise');
|
|
57
|
-
const taa = passes.find(p => p.name === 'TAA');
|
|
58
|
-
if (!resolve || !temporal) { throw new Error('SSR stages missing from the frame graph'); }
|
|
59
|
-
const resolved = resolve.data['@output'][0];
|
|
60
|
-
const reprojected = temporal.data['@output'][0];
|
|
61
|
-
const stages = {
|
|
62
|
-
resolve: resolved,
|
|
63
|
-
spatial1: spatial1?.data['@output'][0] ?? resolved,
|
|
64
|
-
temporal: reprojected,
|
|
65
|
-
spatial2: spatial[0]?.data['@output'][0] ?? reprojected,
|
|
66
|
-
spatial4: spatial[1]?.data['@output'][0] ?? reprojected,
|
|
67
|
-
'pre-taa': taa?.data.ColourTexture ?? frame.get(SceneColor).color,
|
|
68
|
-
scene: frame.get(SceneColor).color,
|
|
69
|
-
};
|
|
70
|
-
const [width, height] = frame.resolution;
|
|
71
|
-
const texture = name => {
|
|
72
|
-
let t = this.textures.get(name);
|
|
73
|
-
if (!t || t.width !== width || t.height !== height) {
|
|
74
|
-
t?.destroy();
|
|
75
|
-
t = GPUTextureContext.fromTexture(this.device.createTexture({
|
|
76
|
-
label: `SSR variance / ${name}`, size: [width, height, 1], format: 'rgba32float',
|
|
77
|
-
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
|
|
78
|
-
}), this.device);
|
|
79
|
-
this.textures.set(name, t);
|
|
80
|
-
}
|
|
81
|
-
return graph_import_texture(frame.graph, t, `SSR variance / ${name}`);
|
|
82
|
-
};
|
|
83
|
-
let mask = texture('mask');
|
|
84
|
-
for (const [name, handle] of Object.entries(stages)) {
|
|
85
|
-
[, mask] = graph_image_pass({ graph: frame.graph, shader,
|
|
86
|
-
inputs: { tSource: handle, tNormal: resolve.data.tNormal }, output: [texture(name), mask] });
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
async read() {
|
|
90
|
-
const result = {};
|
|
91
|
-
for (const [name, texture] of this.textures) {
|
|
92
|
-
result[name] = await download_texture_data({ device: this.device, source: texture.gpu_texture });
|
|
93
|
-
}
|
|
94
|
-
return result;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
1
|
+
import { RenderExtension } from "../../renderer/extension/RenderExtension.js";
|
|
2
|
+
import { FramePhase } from "../../renderer/extension/FramePhase.js";
|
|
3
|
+
import { SceneColor } from "../../renderer/extension/SceneColor.js";
|
|
4
|
+
import { ImageShader } from "../../renderer/shader/ImageShader.js";
|
|
5
|
+
import { CodeChunk } from "../../renderer/shader/compiler/CodeChunk.js";
|
|
6
|
+
import { chunk_decode_g_buffer_normal } from "../../renderer/shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
|
|
7
|
+
import { graph_image_pass } from "../../renderer/shader/graph/graph_image_pass.js";
|
|
8
|
+
import { graph_import_texture } from "../../renderer/shader/graph/graph_import_texture.js";
|
|
9
|
+
import { ShaderResourceSetDescriptor } from "../../renderer/shader/resource/ShaderResourceSetDescriptor.js";
|
|
10
|
+
import { ShaderDescriptor } from "../../renderer/shader/ShaderDescriptor.js";
|
|
11
|
+
import { GPUTextureContext } from "../../renderer/texture/GPUTextureContext.js";
|
|
12
|
+
import { download_texture_data } from "../../renderer/texture/download_texture_data.js";
|
|
13
|
+
|
|
14
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
15
|
+
resources.createGroup().addTexture('tSource', 'unfilterable-float').addTexture('tNormal', 'uint');
|
|
16
|
+
const shader = new ImageShader({
|
|
17
|
+
descriptor: ShaderDescriptor.from({ label: 'SSR variance / capture', resources,
|
|
18
|
+
body: CodeChunk.from(/* language=WGSL */ `
|
|
19
|
+
struct Capture { @location(0) radiance: vec4f, @location(1) mask: vec4f }
|
|
20
|
+
@fragment fn main(@builtin(position) coord: vec4f) -> Capture {
|
|
21
|
+
let p = vec2i(coord.xy);
|
|
22
|
+
var output: Capture;
|
|
23
|
+
output.radiance = textureLoad(tSource, p, 0);
|
|
24
|
+
output.mask = vec4f(select(0.0, 1.0, decode_g_buffer_normal(textureLoad(tNormal, p, 0).xy).y > 0.99));
|
|
25
|
+
return output;
|
|
26
|
+
}`, [chunk_decode_g_buffer_normal]) }),
|
|
27
|
+
targets: [{ format: 'rgba32float' }, { format: 'rgba32float' }],
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
/** TAA-off currently leaves raster jitter active. Freeze only this lab's view before rasterization. */
|
|
31
|
+
export class FixedProjection extends RenderExtension {
|
|
32
|
+
name = 'SSR variance / fixed projection';
|
|
33
|
+
phase = FramePhase.FrameStart;
|
|
34
|
+
record(frame) {
|
|
35
|
+
frame.view.setJitter(0, 0);
|
|
36
|
+
frame.view.camera.setViewportOffset(0, 0);
|
|
37
|
+
frame.view.camera.update();
|
|
38
|
+
frame.view.update_uniforms();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Exact textureLoad copies of production SSR stages, only on requested frames. */
|
|
43
|
+
export class CaptureSSR extends RenderExtension {
|
|
44
|
+
name = 'SSR variance / capture';
|
|
45
|
+
phase = FramePhase.BeforePresent;
|
|
46
|
+
enabled = false;
|
|
47
|
+
textures = new Map();
|
|
48
|
+
constructor(device) { super(); this.device = device; }
|
|
49
|
+
record(frame) {
|
|
50
|
+
if (!this.enabled) { return; }
|
|
51
|
+
this.jitter = Array.from(frame.view.jitter);
|
|
52
|
+
const passes = frame.graph.__pass_nodes;
|
|
53
|
+
const resolve = passes.find(p => p.name === 'SSR resolve / IBL');
|
|
54
|
+
const spatial1 = passes.find(p => p.name.startsWith('SSR / spatial denoise with metadata'));
|
|
55
|
+
const temporal = passes.find(p => p.name.startsWith('SSR Reproject'));
|
|
56
|
+
const spatial = passes.filter(p => p.name === 'SSR / spatial denoise' || p.name === 'SSR / spatial denoise / tiles');
|
|
57
|
+
const taa = passes.find(p => p.name === 'TAA');
|
|
58
|
+
if (!resolve || !temporal) { throw new Error('SSR stages missing from the frame graph'); }
|
|
59
|
+
const resolved = resolve.data['@output'][0];
|
|
60
|
+
const reprojected = temporal.data['@output'][0];
|
|
61
|
+
const stages = {
|
|
62
|
+
resolve: resolved,
|
|
63
|
+
spatial1: spatial1?.data['@output'][0] ?? resolved,
|
|
64
|
+
temporal: reprojected,
|
|
65
|
+
spatial2: spatial[0]?.data['@output'][0] ?? reprojected,
|
|
66
|
+
spatial4: spatial[1]?.data['@output'][0] ?? reprojected,
|
|
67
|
+
'pre-taa': taa?.data.ColourTexture ?? frame.get(SceneColor).color,
|
|
68
|
+
scene: frame.get(SceneColor).color,
|
|
69
|
+
};
|
|
70
|
+
const [width, height] = frame.resolution;
|
|
71
|
+
const texture = name => {
|
|
72
|
+
let t = this.textures.get(name);
|
|
73
|
+
if (!t || t.width !== width || t.height !== height) {
|
|
74
|
+
t?.destroy();
|
|
75
|
+
t = GPUTextureContext.fromTexture(this.device.createTexture({
|
|
76
|
+
label: `SSR variance / ${name}`, size: [width, height, 1], format: 'rgba32float',
|
|
77
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
|
|
78
|
+
}), this.device);
|
|
79
|
+
this.textures.set(name, t);
|
|
80
|
+
}
|
|
81
|
+
return graph_import_texture(frame.graph, t, `SSR variance / ${name}`);
|
|
82
|
+
};
|
|
83
|
+
let mask = texture('mask');
|
|
84
|
+
for (const [name, handle] of Object.entries(stages)) {
|
|
85
|
+
[, mask] = graph_image_pass({ graph: frame.graph, shader,
|
|
86
|
+
inputs: { tSource: handle, tNormal: resolve.data.tNormal }, output: [texture(name), mask] });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async read() {
|
|
90
|
+
const result = {};
|
|
91
|
+
for (const [name, texture] of this.textures) {
|
|
92
|
+
result[name] = await download_texture_data({ device: this.device, source: texture.gpu_texture });
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -1,78 +1,78 @@
|
|
|
1
|
-
import { RenderExtension } from "../../renderer/extension/RenderExtension.js";
|
|
2
|
-
import { ImageShader } from "../../renderer/shader/ImageShader.js";
|
|
3
|
-
import { CodeChunk } from "../../renderer/shader/compiler/CodeChunk.js";
|
|
4
|
-
import { ShaderDescriptor } from "../../renderer/shader/ShaderDescriptor.js";
|
|
5
|
-
import { ShaderResourceSetDescriptor } from "../../renderer/shader/resource/ShaderResourceSetDescriptor.js";
|
|
6
|
-
import { WebGPUStruct } from "../../renderer/shader/type/WebGPUStruct.js";
|
|
7
|
-
import { f32 } from "../../renderer/shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
8
|
-
import { graph_image_pass } from "../../renderer/shader/graph/graph_image_pass.js";
|
|
9
|
-
import { graph_import_texture } from "../../renderer/shader/graph/graph_import_texture.js";
|
|
10
|
-
import { GPUTextureContext } from "../../renderer/texture/GPUTextureContext.js";
|
|
11
|
-
import { download_texture_data } from "../../renderer/texture/download_texture_data.js";
|
|
12
|
-
|
|
13
|
-
const settings = WebGPUStruct.from({ count: f32 });
|
|
14
|
-
const resources = new ShaderResourceSetDescriptor();
|
|
15
|
-
resources.setImmediate('settings', settings);
|
|
16
|
-
resources.createGroup().addTexture('tInput', 'unfilterable-float').addTexture('tPrevious', 'unfilterable-float');
|
|
17
|
-
const shader = new ImageShader({ descriptor: ShaderDescriptor.from({
|
|
18
|
-
label: 'SSR lab / later-sample reference', resources,
|
|
19
|
-
body: CodeChunk.from(/* language=WGSL */ `
|
|
20
|
-
@fragment fn main(@builtin(position) coord: vec4f) -> @location(0) vec4f {
|
|
21
|
-
let p = vec2i(coord.xy);
|
|
22
|
-
let sample = textureLoad(tInput, p, 0);
|
|
23
|
-
if (settings.count <= 1.0) { return sample; }
|
|
24
|
-
let previous = textureLoad(tPrevious, p, 0);
|
|
25
|
-
return previous + (sample - previous) / settings.count;
|
|
26
|
-
}`, [settings.declaration_chunk]),
|
|
27
|
-
}), targets: [{ format: 'rgba32float' }] });
|
|
28
|
-
|
|
29
|
-
/** Unclipped float32 average of later pre-temporal samples, never fed into rendering. */
|
|
30
|
-
export class ReflectionReference extends RenderExtension {
|
|
31
|
-
name = 'SSR lab / later-sample reference';
|
|
32
|
-
enabled = false;
|
|
33
|
-
count = 0;
|
|
34
|
-
textures = [];
|
|
35
|
-
constructor(device) { super(); this.device = device; }
|
|
36
|
-
record(frame) {
|
|
37
|
-
if (!this.enabled) { return; }
|
|
38
|
-
const temporal = frame.graph.__pass_nodes.find(p => p.name
|
|
39
|
-
if (!temporal) { throw new Error('SSR is required for a reflection reference'); }
|
|
40
|
-
if (!this.textures.length) {
|
|
41
|
-
for (let i = 0; i < 2; i++) {
|
|
42
|
-
this.textures.push(GPUTextureContext.fromTexture(this.device.createTexture({
|
|
43
|
-
size: [frame.resolution[0], frame.resolution[1], 1], format: 'rgba32float',
|
|
44
|
-
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
|
|
45
|
-
}), this.device));
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
const index = this.count % 2;
|
|
49
|
-
const previous = graph_import_texture(frame.graph, this.textures[1 - index], 'SSR reference previous');
|
|
50
|
-
const output = graph_import_texture(frame.graph, this.textures[index], 'SSR reference output');
|
|
51
|
-
graph_image_pass({ graph: frame.graph, shader,
|
|
52
|
-
inputs: { tInput: temporal.data.tInput, tPrevious: previous, settings: { count: this.count + 1 } },
|
|
53
|
-
output: [output] });
|
|
54
|
-
this.count++;
|
|
55
|
-
}
|
|
56
|
-
async read() {
|
|
57
|
-
if (!this.count) { throw new Error('Reference has no samples'); }
|
|
58
|
-
return download_texture_data({ device: this.device,
|
|
59
|
-
source: this.textures[(this.count - 1) % 2].gpu_texture });
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export function reflection_error(sample, reference, mask, width, height) {
|
|
64
|
-
let count = 0, squared_error = 0, bias = 0;
|
|
65
|
-
for (let y = Math.floor(height * 0.5); y < Math.floor(height * 0.92); y++) {
|
|
66
|
-
for (let x = Math.floor(width * 0.25); x < Math.floor(width * 0.75); x++) {
|
|
67
|
-
const p = (y * width + x) * 4;
|
|
68
|
-
if (mask[p] <= 0.5) { continue; }
|
|
69
|
-
const error = (sample[p] - reference[p]) * 0.2126
|
|
70
|
-
+ (sample[p + 1] - reference[p + 1]) * 0.7152
|
|
71
|
-
+ (sample[p + 2] - reference[p + 2]) * 0.0722;
|
|
72
|
-
if (!Number.isFinite(error)) { throw new Error('Non-finite convergence sample'); }
|
|
73
|
-
squared_error += error * error; bias += error; count++;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
if (!count) { throw new Error('No reflection pixels in convergence sample'); }
|
|
77
|
-
return { pixels: count, mse: squared_error / count, rmse: Math.sqrt(squared_error / count), bias: bias / count };
|
|
78
|
-
}
|
|
1
|
+
import { RenderExtension } from "../../renderer/extension/RenderExtension.js";
|
|
2
|
+
import { ImageShader } from "../../renderer/shader/ImageShader.js";
|
|
3
|
+
import { CodeChunk } from "../../renderer/shader/compiler/CodeChunk.js";
|
|
4
|
+
import { ShaderDescriptor } from "../../renderer/shader/ShaderDescriptor.js";
|
|
5
|
+
import { ShaderResourceSetDescriptor } from "../../renderer/shader/resource/ShaderResourceSetDescriptor.js";
|
|
6
|
+
import { WebGPUStruct } from "../../renderer/shader/type/WebGPUStruct.js";
|
|
7
|
+
import { f32 } from "../../renderer/shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
8
|
+
import { graph_image_pass } from "../../renderer/shader/graph/graph_image_pass.js";
|
|
9
|
+
import { graph_import_texture } from "../../renderer/shader/graph/graph_import_texture.js";
|
|
10
|
+
import { GPUTextureContext } from "../../renderer/texture/GPUTextureContext.js";
|
|
11
|
+
import { download_texture_data } from "../../renderer/texture/download_texture_data.js";
|
|
12
|
+
|
|
13
|
+
const settings = WebGPUStruct.from({ count: f32 });
|
|
14
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
15
|
+
resources.setImmediate('settings', settings);
|
|
16
|
+
resources.createGroup().addTexture('tInput', 'unfilterable-float').addTexture('tPrevious', 'unfilterable-float');
|
|
17
|
+
const shader = new ImageShader({ descriptor: ShaderDescriptor.from({
|
|
18
|
+
label: 'SSR lab / later-sample reference', resources,
|
|
19
|
+
body: CodeChunk.from(/* language=WGSL */ `
|
|
20
|
+
@fragment fn main(@builtin(position) coord: vec4f) -> @location(0) vec4f {
|
|
21
|
+
let p = vec2i(coord.xy);
|
|
22
|
+
let sample = textureLoad(tInput, p, 0);
|
|
23
|
+
if (settings.count <= 1.0) { return sample; }
|
|
24
|
+
let previous = textureLoad(tPrevious, p, 0);
|
|
25
|
+
return previous + (sample - previous) / settings.count;
|
|
26
|
+
}`, [settings.declaration_chunk]),
|
|
27
|
+
}), targets: [{ format: 'rgba32float' }] });
|
|
28
|
+
|
|
29
|
+
/** Unclipped float32 average of later pre-temporal samples, never fed into rendering. */
|
|
30
|
+
export class ReflectionReference extends RenderExtension {
|
|
31
|
+
name = 'SSR lab / later-sample reference';
|
|
32
|
+
enabled = false;
|
|
33
|
+
count = 0;
|
|
34
|
+
textures = [];
|
|
35
|
+
constructor(device) { super(); this.device = device; }
|
|
36
|
+
record(frame) {
|
|
37
|
+
if (!this.enabled) { return; }
|
|
38
|
+
const temporal = frame.graph.__pass_nodes.find(p => p.name.startsWith('SSR Reproject'));
|
|
39
|
+
if (!temporal) { throw new Error('SSR is required for a reflection reference'); }
|
|
40
|
+
if (!this.textures.length) {
|
|
41
|
+
for (let i = 0; i < 2; i++) {
|
|
42
|
+
this.textures.push(GPUTextureContext.fromTexture(this.device.createTexture({
|
|
43
|
+
size: [frame.resolution[0], frame.resolution[1], 1], format: 'rgba32float',
|
|
44
|
+
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
|
|
45
|
+
}), this.device));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const index = this.count % 2;
|
|
49
|
+
const previous = graph_import_texture(frame.graph, this.textures[1 - index], 'SSR reference previous');
|
|
50
|
+
const output = graph_import_texture(frame.graph, this.textures[index], 'SSR reference output');
|
|
51
|
+
graph_image_pass({ graph: frame.graph, shader,
|
|
52
|
+
inputs: { tInput: temporal.data.tInput, tPrevious: previous, settings: { count: this.count + 1 } },
|
|
53
|
+
output: [output] });
|
|
54
|
+
this.count++;
|
|
55
|
+
}
|
|
56
|
+
async read() {
|
|
57
|
+
if (!this.count) { throw new Error('Reference has no samples'); }
|
|
58
|
+
return download_texture_data({ device: this.device,
|
|
59
|
+
source: this.textures[(this.count - 1) % 2].gpu_texture });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function reflection_error(sample, reference, mask, width, height) {
|
|
64
|
+
let count = 0, squared_error = 0, bias = 0;
|
|
65
|
+
for (let y = Math.floor(height * 0.5); y < Math.floor(height * 0.92); y++) {
|
|
66
|
+
for (let x = Math.floor(width * 0.25); x < Math.floor(width * 0.75); x++) {
|
|
67
|
+
const p = (y * width + x) * 4;
|
|
68
|
+
if (mask[p] <= 0.5) { continue; }
|
|
69
|
+
const error = (sample[p] - reference[p]) * 0.2126
|
|
70
|
+
+ (sample[p + 1] - reference[p + 1]) * 0.7152
|
|
71
|
+
+ (sample[p + 2] - reference[p + 2]) * 0.0722;
|
|
72
|
+
if (!Number.isFinite(error)) { throw new Error('Non-finite convergence sample'); }
|
|
73
|
+
squared_error += error * error; bias += error; count++;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (!count) { throw new Error('No reflection pixels in convergence sample'); }
|
|
77
|
+
return { pixels: count, mse: squared_error / count, rmse: Math.sqrt(squared_error / count), bias: bias / count };
|
|
78
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Virtual shadow maps
|
|
2
|
+
|
|
3
|
+
`npm run dev`, then `/src/shade/playground/vsm/`.
|
|
4
|
+
|
|
5
|
+
A directional light's virtual shadow map — a clipmap of 128-texel pages around the camera, rendered
|
|
6
|
+
into a pool in the shadow atlas as the view asks for them and as moving casters make them stale,
|
|
7
|
+
under a budget of page updates per frame. The design is in
|
|
8
|
+
`src/shade/renderer/shadow/vsm/PLAN.md`.
|
|
9
|
+
|
|
10
|
+
## Scenes
|
|
11
|
+
|
|
12
|
+
* **Courtyard.** Structure at every scale the clipmap covers: 5 cm fence slats by the camera, pillars
|
|
13
|
+
and walls, an overhang, thin poles twenty metres off, and an avenue reaching two hundred metres.
|
|
14
|
+
The movers each exercise a different case of the GPU mover pass:
|
|
15
|
+
- orbiting boxes (translation);
|
|
16
|
+
- a bobbing column;
|
|
17
|
+
- a turning bar (a rotation about its own centre);
|
|
18
|
+
- a block that blinks in and out of the scene (a row appearing and leaving).
|
|
19
|
+
* **Crowd.** N wandering boxes, adjustable from 50 to 6000, added to or taken from the same scene.
|
|
20
|
+
Past 4096 the mover list overflows and every occupied page is taken to be stale, which the stats
|
|
21
|
+
say.
|
|
22
|
+
|
|
23
|
+
## Controls
|
|
24
|
+
|
|
25
|
+
* **Technique.** Virtual shadow map, or the engine's cascades for an A/B comparison in the same
|
|
26
|
+
scene.
|
|
27
|
+
* **Page updates per frame.** `Renderer.shadow_virtual_page_budget`. Pages wanted beyond it wait,
|
|
28
|
+
best first:
|
|
29
|
+
- covers for unshadowed pixels come first;
|
|
30
|
+
- then stale and missing pages, by the importance of the pixels asking × frames waited. A
|
|
31
|
+
pixel's importance is its weight under the automatic exposure's metering mask: full over most of
|
|
32
|
+
the screen, falling toward its edges, so the middle of the view resolves first.
|
|
33
|
+
* **LOD bias, finest texel.** `shadow_virtual_lod_bias`, `shadow_virtual_first_texel_size`. The texel
|
|
34
|
+
size rebuilds the map.
|
|
35
|
+
* **Pause page updates** sets the budget to 0: no page is drawn or installed, so a stale page stays
|
|
36
|
+
as it was last drawn and a missing one stays missing. Pages still leave when the camera scrolls
|
|
37
|
+
their window past them, and all of them when the sun turns.
|
|
38
|
+
* **Sweep the sun / Nudge the sun.** Any change of light direction invalidates every page; see
|
|
39
|
+
"Known limits" in the plan.
|
|
40
|
+
|
|
41
|
+
## Debug views
|
|
42
|
+
|
|
43
|
+
* **Overlay** — what shadows each pixel. It runs the same lookup the lighting does:
|
|
44
|
+
- **Serving level**: the level of the page that shadows the pixel, red (finest) through to violet.
|
|
45
|
+
- **Resolution deficit**: how many levels coarser that page is than the level the pixel asked for.
|
|
46
|
+
Green means exactly the level asked for, yellow one coarser, orange two, red more. Magenta means
|
|
47
|
+
nothing resident covers the pixel at all.
|
|
48
|
+
- **Page IDs and edges**: a colour per page, its edges drawn at its own resolution.
|
|
49
|
+
* **Physical pool inset** (bottom left): every slot of the pool, its depth banded every 2 m along the
|
|
50
|
+
light. Slot edges are tinted by the page's level, and grey where the slot is empty. A slot the page
|
|
51
|
+
manager holds stale (a mover crossed it and it has not been drawn since) is washed red all over.
|
|
52
|
+
* **Clipmap panel**: the CPU's view of each level's window, one pixel per page, light-space y up.
|
|
53
|
+
- green: resident; white: drawn this frame; red: stale;
|
|
54
|
+
- amber: wanted by the latest reading and missing;
|
|
55
|
+
- cyan cross: the camera.
|
|
56
|
+
|
|
57
|
+
"Panel shows" picks one level, drawn large.
|
|
58
|
+
* **State**: what the page manager did. This frame: pages drawn and waiting. The latest reading:
|
|
59
|
+
wanted, uncovered, dropped. Also movers, stale marks, installs and evictions, invalidations, and
|
|
60
|
+
readbacks in flight.
|
|
61
|
+
|
|
62
|
+
`T` records a GPU profile (`.sgpt`).
|
|
63
|
+
|
|
64
|
+
## Console
|
|
65
|
+
|
|
66
|
+
* `vsm_lab.map()` is the `VirtualShadowMap`; `vsm_lab.stats()` copies its page manager's stats.
|
|
67
|
+
* `await vsm_lab.configure({ id: value, … })` sets controls by element id; a `scene` or `crowd`
|
|
68
|
+
change is in place when it resolves.
|
|
69
|
+
* `vsm_lab.frame_preset('near' | 'overview' | 'avenue' | 'crowd')`.
|
|
70
|
+
* `await verify()` holds the movers and the sun still and waits for the pages to settle: a reading
|
|
71
|
+
recorded after the stop that asks for pages and leaves nothing uncovered or waiting. It then holds
|
|
72
|
+
page updates, reads the light database back from the GPU, and checks:
|
|
73
|
+
- every row the map claimed came back, and its record names its runs and depth range;
|
|
74
|
+
- every page-table entry, slot row and window corner equals the CPU's;
|
|
75
|
+
- on the GPU alone, every resident entry's slot holds a page of the entry's own cell;
|
|
76
|
+
- no page is held twice.
|
|
77
|
+
|
|
78
|
+
It returns `{ pass, checks, stats }`, and puts the controls back as they were.
|
|
79
|
+
|
|
80
|
+
## Measured (RTX 4090, headless Chrome, 1600×900, 2026-10-04)
|
|
81
|
+
|
|
82
|
+
Courtyard, near camera, movers animating. GPU time per frame, paired arms in one launch:
|
|
83
|
+
|
|
84
|
+
| arm | frame p50 | pages drawn / frame |
|
|
85
|
+
|---|---|---|
|
|
86
|
+
| VSM, budget 0 (feedback only) | 734–758 µs | 0 |
|
|
87
|
+
| VSM, budget 1 | 779–795 µs | 1.0 |
|
|
88
|
+
| VSM, budget 8 | 1072–1076 µs | 7.1–7.5 |
|
|
89
|
+
| cascades (3) | 1273–1305 µs | — |
|
|
90
|
+
|
|
91
|
+
- The feedback passes (`VSM/*`) cost about 59 µs a frame, 46 µs of it the demand pass at 1600×900.
|
|
92
|
+
- A page costs about 40–45 µs of GPU time and about 85 µs of CPU in `render()`. CPU p50 per frame
|
|
93
|
+
is 1.3 ms at budget 0, 2.0 ms at budget 8, 2.0 ms with cascades, and 3.1–3.3 ms at budget 32 (17
|
|
94
|
+
pages drawn).
|
|
95
|
+
- `verify()` passes: settled four frames after the movers stopped; 49,152 page-table entries, 900
|
|
96
|
+
slots and 12 windows agree.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the overlay shows over the picture.
|
|
3
|
+
*/
|
|
4
|
+
export type VSMDebugView = number;
|
|
5
|
+
export namespace VSMDebugView {
|
|
6
|
+
let None: number;
|
|
7
|
+
let ServingLevel: number;
|
|
8
|
+
let Deficit: number;
|
|
9
|
+
let Pages: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The playground's view into a virtual shadow map, drawn over the frame before it is presented:
|
|
13
|
+
* a tint per pixel saying what shadows it ({@link VSMDebugView}), and an inset of the physical pool
|
|
14
|
+
* — every slot's depth, its edge tinted by its page's level, washed red where the page manager holds
|
|
15
|
+
* it stale (a mover crossed it and it has not been drawn since), its edge grey where it is empty.
|
|
16
|
+
*
|
|
17
|
+
* The tint runs the lighting's own page lookup on the frame's light database rows, so the page it
|
|
18
|
+
* names for a pixel is the page the lighting samples there. The stale state is the CPU's, uploaded
|
|
19
|
+
* each frame the inset is drawn.
|
|
20
|
+
*/
|
|
21
|
+
export class VSMDebugOverlay extends RenderExtension {
|
|
22
|
+
/**
|
|
23
|
+
* @param {import("../../renderer/GraphicsContext.js").GraphicsContext} graphics
|
|
24
|
+
*/
|
|
25
|
+
constructor(graphics: import("../../renderer/GraphicsContext.js").GraphicsContext);
|
|
26
|
+
/**
|
|
27
|
+
* @type {number} a {@link VSMDebugView}
|
|
28
|
+
*/
|
|
29
|
+
mode: number;
|
|
30
|
+
/**
|
|
31
|
+
* Whether to draw the pool inset.
|
|
32
|
+
* @type {boolean}
|
|
33
|
+
*/
|
|
34
|
+
inset: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* The map to show; the overlay draws nothing without one.
|
|
37
|
+
* @type {import("../../renderer/shadow/vsm/VirtualShadowMap.js").VirtualShadowMap|null}
|
|
38
|
+
*/
|
|
39
|
+
map: import("../../renderer/shadow/vsm/VirtualShadowMap.js").VirtualShadowMap | null;
|
|
40
|
+
/**
|
|
41
|
+
* The shadow context whose atlas the map's pool is in.
|
|
42
|
+
* @type {import("../../renderer/shadow/map/GPUSceneShadowmapContext.js").GPUSceneShadowmapContext|null}
|
|
43
|
+
*/
|
|
44
|
+
shadows: import("../../renderer/shadow/map/GPUSceneShadowmapContext.js").GPUSceneShadowmapContext | null;
|
|
45
|
+
destroy(): void;
|
|
46
|
+
#private;
|
|
47
|
+
}
|
|
48
|
+
import { RenderExtension } from "../../renderer/extension/RenderExtension.js";
|
|
49
|
+
//# sourceMappingURL=VSMDebugOverlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VSMDebugOverlay.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/vsm/VSMDebugOverlay.js"],"names":[],"mappings":";;;2BAyBU,MAAM;;;;;;;AA2LhB;;;;;;;;;GASG;AACH;IAuCI;;OAEG;IACH,sBAFW,OAAO,mCAAmC,EAAE,eAAe,EAMrE;IAzCD;;OAEG;IACH,MAFU,MAAM,CAES;IAEzB;;;OAGG;IACH,OAFU,OAAO,CAEH;IAEd;;;OAGG;IACH,KAFU,OAAO,+CAA+C,EAAE,gBAAgB,GAAC,IAAI,CAE5E;IAEX;;;OAGG;IACH,SAFU,OAAO,uDAAuD,EAAE,wBAAwB,GAAC,IAAI,CAExF;IAiGf,gBAIC;;CACJ;gCA3V+B,6CAA6C"}
|